使用现有项将json反序列化为C#列表

时间:2015-06-24 11:20:17

标签: c# json json.net

鉴于以下类别:

class Report {

    public Report() {
        this.Fields=new List<Field>();
    }

    [JsonProperty("fields")]
    public IList<Field> Fields { get; private set; }
}

class Field {

    [JsonProperty("identifier")]
    public Guid Identfier { get;set; }

    [JsonProperty("name")]
    public string Name { get;set; }
}

并设置以下测试方法:

var report = new Report();
report.Fields.Add(new Field { Identifier = new Guid("26a94eab-3d50-4330-8203-e7750abaa060"), Name = "Field 1" });
report.Fields.Add(new Field { Identifier = new Guid("852107db-b5d1-4344-9f71-7bd90b96fec0"), Name = "Field 2" });

var json = "{\"fields\":[{\"identifier\":\"852107db-b5d1-4344-9f71-7bd90b96fec0\",\"name\":\"name changed\"},{\"identifier\":\"ac424aff-22b5-4bf3-8232-031eb060f7c2\",\"name\":\"new field\"}]}";

JsonConvert.PopulateObject(json, report);

Assert.IsTrue(report.Fields.Count == 2, "The number of fields was incorrect.");

如何让JSON.Net知道带有标识符&#34; 852107db-b5d1-4344-9f71-7bd90b96fec0&#34;的字段?应该应用于具有相同标识符的现有字段吗?

此外,是否可以让JSON.Net删除给定JSON数组中不存在的项目(特别是具有标识符&#34的字段; 26a94eab-3d50-4330-8203-e7750abaa060&#34;应该是删除,因为它在给定的json数组中不存在。

如果有办法手动编码或覆盖JSON分析列表的方式那么那会更好,因为我可以编写代码来说&#34;这是你需要的项目&#34;或者&#34;使用这个新创建的项目&#34;或者只是“不要对这个项目做任何事情,因为我已经删除了它”#34;。有人知道我能做到这一点吗?

1 个答案:

答案 0 :(得分:3)

您可以使用ObjectCreationHandling = ObjectCreationHandling.Replace选项。

您可以使用序列化设置为整个数据模型执行此操作,如Json.Net PopulateObject Appending list rather than setting value中所示:

    var serializerSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace};
    JsonConvert.PopulateObject(json, report, serializerSettings);

或者,如果您不想普遍这样做,可以在已经使用的JsonProperty属性上设置选项:

class Report
{
    public Report()
    {
        this.Fields = new List<Field>();
    }

    [JsonProperty("fields", ObjectCreationHandling = ObjectCreationHandling.Replace)]
    public IList<Field> Fields { get; private set; }
}