【问题标题】:JsonConvert.PopulateObject not using JsonConverter class attributeJsonConvert.PopulateObject 不使用 JsonConverter 类属性
【发布时间】:2016-11-28 23:35:28
【问题描述】:

当尝试使用JsonConvert.PopulateObject 更新类属性时,不会调用JsonPathConverter,因此不会完成填充。

示例类:

[JsonConverter(typeof(JsonPathConverter))]
public class SampleClass
{
    int id;
    [JsonProperty("sample.id")]
    public int Id
    {
        get
        {
            return id;
        }
        set
        {
            id = value;
        }
    }
}

致电PopulateObject:

var sampleClass = new SampleClass() {
    Id  = 1
};

var str = "{sample:{id:2}}";
JsonConvert.PopulateObject(str, sampleClass, new JsonSerializerSettings());

但Id 属性永远不会设置为 2。

我已经尝试JsonSerializerSettings 和converter = new JsonPathConverter(),但它也不起作用。

知道为什么它不起作用吗?

【问题讨论】:

    标签: c# json.net deserialization


    【解决方案1】:

    注意:我假设您在问题中所指的JsonPathConverter 是this answer 中的那个。

    ReadJson 仅在需要实例化由转换器处理的对象时才在 JsonConverter 上调用。由于PopulateObject 适用于已经实例化的对象,因此PopulateObject 不会调用转换器的ReadJson 方法。这是设计使然。如果您使用JsonConvert.DeserializeObject<T> 而不是JsonConvert.PopulateObject,则转换器将按预期调用:

    var sampleClass = JsonConvert.DeserializeObject<SampleClass>(str);
    

    小提琴:https://dotnetfiddle.net/lxiirm

    【讨论】:

    • 是的,我注意到它只在使用 DeserializeObject 时被调用。但我真的需要使用填充(更新现有对象的属性)。关于如何做到这一点的任何想法?我可以使用反射将值从一个对象复制到另一个对象,我只是不确定使用填充是否会更快......
    • 这个问题有更新吗?在 Json.Net 13.0.1 中,ReadJson 是通过 existingValue 参数,用于 Populate
    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2019-08-02
    • 1970-01-01
    • 2013-07-19
    相关资源
    最近更新 更多