Example #1
0
    /// <inheritdoc />
    public override ChemicalElement Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.Null)
        {
            return(null);
        }
        try
        {
            if (reader.TokenType == JsonTokenType.Number)
            {
                return(ChemicalElement.Get(reader.GetInt32()));
            }
        }
        catch (FormatException ex)
        {
            throw new JsonException("Expect a valid element symbol or the atomic numbers.", ex);
        }

        if (reader.TokenType == JsonTokenType.String)
        {
            return(ChemicalElement.Get(reader.GetString()));
        }
        if (reader.TokenType != JsonTokenType.StartObject)
        {
            throw new JsonException("The format is not correct.", new FormatException("The value should be a date time JSON token format."));
        }
        var obj = new JsonObjectNode();

        obj.SetRange(ref reader);
        var             z   = obj.TryGetInt32Value("number") ?? obj.TryGetInt32Value("z");
        var             s   = obj.TryGetStringValue("symbol")?.Trim();
        var             n   = obj.TryGetStringValue("name_en")?.Trim() ?? obj.TryGetStringValue("name")?.Trim();
        var             w   = obj.TryGetDoubleValue("weight");
        ChemicalElement ele = null;

        if (z.HasValue && z != 0)
        {
            if (z.Value < 1)
            {
                return(null);
            }
            ele = ChemicalElement.Get(z.Value);
        }
        else if (!string.IsNullOrEmpty(s))
        {
            ele = ChemicalElement.Get(s);
        }
        else if (!string.IsNullOrEmpty(n))
        {
            ele = ChemicalElement.Where(ele => n.Equals(ele.EnglishName, StringComparison.Ordinal)).FirstOrDefault();
            if (ele is null && n.Length < 4)
            {
                ele = ChemicalElement.Get(n);
            }
        }
        else
        {
            return(null);
        }

        if (ele != null &&
            (!z.HasValue || ele.AtomicNumber == z.Value) &&
            (string.IsNullOrEmpty(s) || s.Equals(ele.Symbol, StringComparison.OrdinalIgnoreCase)) &&
            (!w.HasValue || (!ele.HasAtomicWeight && double.IsNaN(w.Value)) || (ele.HasAtomicWeight && !double.IsNaN(w.Value) && Math.Abs(ele.AtomicWeight - w.Value) < 0.000000001)))
        {
            return(ele);
        }

        if (!z.HasValue || z.Value < 1 || string.IsNullOrEmpty(s))
        {
            return(null);
        }
        return(string.IsNullOrEmpty(n)
            ? new ChemicalElement(z.Value, s, null, w.HasValue ? w.Value : double.NaN)
            : new ChemicalElement(z.Value, s, n, true, w.HasValue ? w.Value : double.NaN));
    }