将 JSON.NET 解析错误添加到 JsonExtensionData 中



我有一个这样的对象:

public class Foo
{
    int bar;
    [JsonExtensionData] public Dictionary<string, object> Catchall;
}

和这样的 JSON: jsonString = { "bar": "not an int", "dink": 1 }

所以如果我var foo = JsonConvert.DeserializeObject<Foo>(jsonString)

bar将无法反序列化到类Foo中,因为它的类型错误,但是是否可以将其插入到[JsonExtensionData] Catchall字典中?

您可以使用 [JsonIgnore] 标记属性bar,然后在相应的序列化回调中手动添加和删除其在Catchall字典中的值:

public class Foo
{
    const string barName = "bar";
    [JsonIgnore]
    public int? Bar { get; set; }
    [JsonExtensionData]
    public Dictionary<string, object> Catchall;
    [OnSerializing]
    void OnSerializing(StreamingContext ctx)
    {
        if (Catchall == null)
            Catchall = new Dictionary<string, object>();
        if (Bar != null)
            Catchall[barName] = Bar.Value;
    }
    [OnSerialized]
    void OnSerialized(StreamingContext ctx)
    {
        if (Catchall != null)
            Catchall.Remove(barName);
    }
    [OnDeserialized]
    void OnDeserializedMethod(StreamingContext context)
    {
        if (Catchall != null)
        {
            object value;
            if (Catchall.TryGetValue(barName, out value))
            {
                try
                {
                    if (value == null)
                    {
                        Bar = null;
                    }
                    else
                    {
                        Bar = (int)JToken.FromObject(value);
                    }
                    Catchall.Remove(barName);
                }
                catch (Exception)
                {
                    Debug.WriteLine(string.Format("Value "{0}" of {1} was not an integer", value, barName));
                }
            }
        }
    }
}

请注意,我已将bar更改为public int? Bar { get; set; }。 null 值指示 Bar 的整数值未反序列化,因此,在重新序列化时,字典中的值(如果有)不应被属性的值取代。

相关内容

  • 没有找到相关文章

最新更新