【问题标题】:Merge JSON with same Item将 JSON 与相同的项目合并
【发布时间】:2018-08-24 09:02:22
【问题描述】:

有没有办法合并这些 JSON:

JSON 1

{
    "items": [{
        "date": "2018-08-25",
        "id": 1,
        "name": "John"
    }]
}

JSON 2

{
    "items": [{
        "date": "2018-08-25",
        "id": 1,
        "age": 20,
        "address": "USA",
        "Weight": "256 kg"
    }]
}

结果

{
    "items": [{
        "date": "2018-08-25",
        "id": 1,
        "name": "John",
        "age": 20,
        "address": "USA",
        "Weight": "256 kg"
    }]
}

请注意,我想合并与轴承具有相同 ID 的 JSON 项目。这可以实现吗?感谢您的反馈

【问题讨论】:

标签: c# arrays json json.net


【解决方案1】:

您可以尝试为json1和json2数据格式创建一些对象。

public class Item1
{
    public string date { get; set; }
    public int id { get; set; }
    public string name { get; set; }
}

public class Object1
{
    public List<Item1> items { get; set; }
}
public class Item2
{
    public string date { get; set; }
    public int id { get; set; }
    public int age { get; set; }
    public string address { get; set; }
    public string Weight { get; set; }
}

public class Object2
{
    public List<Item2> items { get; set; }
}
public class Item
{
    public string date { get; set; }
    public int id { get; set; }
    public string name { get; set; }
    public int age { get; set; }
    public string address { get; set; }
    public string Weight { get; set; }
}

public class Result
{
    public List<Item> items { get; set; }
}

并使用DeserializeObject从json字符串中获取对象数据。

Object1 obj1 = JsonConvert.DeserializeObject<Object1>(Json1);

Object2 obj2 = JsonConvert.DeserializeObject<Object2>(Json2);

然后使用 linq join 创建结果列表。

var resultList = (from o1 in obj1.items
join o2 in obj2.items on o1.id equals o2.id
select new Item()
{
    id = o1.id,
    date = o1.date,
    address = o2.address,
    age = o2.age,
     name = o1.name,
     Weight = o2.Weight
}).ToList();

最终使用 SerializeObjectResult 转换为结果 json。

string jsonResult = JsonConvert.SerializeObject(new Result() { items = resultList });

编辑

如果你想避免创建过多的类,你可以尝试使用JObject.Parse linq join on JToken 字典,所以你不需要创建对象类来携带 JSON 数据。

var obj1 = JObject.Parse(Json1);
var obj2 = JObject.Parse(Json2);

var resultList = (from o1 in obj1["items"]
                  join o2 in obj2["items"] on o1["id"] equals o2["id"]
                  select new Item()
                  {
                      id = o1["id"].ToObject<int>(),
                      date = o1["date"].ToObject<string>(),
                      address = o2["address"].ToObject<string>(),
                      age = o2["age"].ToObject<int>(),
                      name = o1["name"].ToObject<string>(),
                      Weight = o2["Weight"].ToObject<string>()
                  }).ToList();
JsonConvert.SerializeObject(new Result() { items = resultList });

string jsonResult = JsonConvert.SerializeObject(new Result() { items = resultList });

c# online

结果

{
    "items":[
        {
        "date":"2018-08-25",
        "id":1,
        "name":"John",
        "age":20,
        "address":"USA",
        "Weight":"256 kg"
        }
    ]
}

【讨论】:

  • 但是如果我有几个项目,这将是一个不便。有没有办法可以动态地做到这一点?
  • 动态是什么意思?动态创建对象或映射或类?
  • 是的。如果我有 100 件物品怎么办。那cw9uld要创建很多对象
  • 有了这个,我还需要在select new Item()下放入100项
【解决方案2】:
{
    "date": "2018-08-25",
    "id": 1,
    "name": "John"
}

可以反序列化为Dictionary&lt;string, object&gt;

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多