使用现有项目将json反序列化为C#列表 [英] Deserializing json to C# list with existing items

查看:94
本文介绍了使用现有项目将json反序列化为C#列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给出以下类别:

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知道标识符为"852107db-b5d1-4344-9f71-7bd90b96fec0"的字段应应用于具有相同标识符的现有字段?

How do I get JSON.Net to know that the field with identifier "852107db-b5d1-4344-9f71-7bd90b96fec0" should apply to the existing field with the same identifier?

此外,是否可以获取JSON.Net来删除给定JSON数组中不存在的项目,(特别是应删除标识符为"26a94eab-3d50-4330-8203-e7750abaa060"的字段,因为它不会存在于给定的json数组中.

Also, is it possible to get JSON.Net to remove items that do not exist within the given JSON array, (specifically the field with identifier "26a94eab-3d50-4330-8203-e7750abaa060" should be removed because it does not exist in the given json array.

如果有一种方法可以手动编码或覆盖JSON分析列表的方式,那会更好,因为我可以编写代码说这是您需要的项目"或使用此新创建的项目",或者只是不要对这个项目做任何事情,因为我已经删除了它".有人知道我可以做到这一点的方法吗?

If there is a way to manually code or override the way that JSON analyses a list then that would be better because I could write the code to say "this is the item you need" or "use this newly created item" or just "don't do anything to this item because I have removed it". Anyone know of a way I can do this please?

推荐答案

您可以使用选项

You can use the option ObjectCreationHandling = ObjectCreationHandling.Replace.

您可以使用序列化程序设置对整个数据模型执行此操作,如

You can do this for your entire data model using serializer settings, as is shown in Json.Net PopulateObject Appending list rather than setting value:

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

或者,您可以在 JsonProperty 上设置选项如果您不想普遍使用此属性,则该属性已被使用:

Or, you can set the option on the JsonProperty attribute you are already using if you don't want to do this universally:

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

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

这篇关于使用现有项目将json反序列化为C#列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆