【发布时间】:2020-10-13 06:52:47
【问题描述】:
我有两个 jsons 数据: json1:
[
{"name":"a1", "quantity": 10 },
{"name":"a2", "quantity": 11 },
{"name":"a3", "quantity": 12 },
{"name":"a4", "quantity": 13 },
{"name":"a5", "quantity": 14 },
]
Json2:
[
{"name":"a1", "quantity": 11 },
{"name":"b1", "quantity": 1 },
{"name":"b2", "quantity": 12 },
{"name":"a3", "quantity": 13 },
{"name":"a5", "quantity": 14 },
]
我希望 Json1 的数量减去 Json2 基于相同“名称”的数量
结果将返回所有 Json1 的项目加上另一个属性“不同”。
[
{"name":"a1", "quantity": 10, "differ": -1 },
{"name":"a2", "quantity": 11, "differ": 11 }, // "a2" is not in Json2, so "differ" will be 11
{"name":"a3", "quantity": 12, "differ": -1 },
{"name":"a4", "quantity": 13, "differ": 13 },
{"name":"a5", "quantity": 14, "differ": 0 },
]
当使用下面的解决方案时,输入数据(Json1 和 Json2)有超过 3000-5000 个项目大约需要 2 秒。寻找性能更好的新解决方案。用大约 5000 个项目说不到 1 秒。
C#代码:
public string GetDiff(string json1, string json2)
{
var json1Array = JArray.Parse(json1);
var json2Array = JArray.Parse(json2);
var json3Array = new JArray();
foreach (var item in json1Array)
{
var name = (string) item["name"];
var quantity = (int) item["quantity"];
var differ = quantity;
var itemJson2 = json2Array.Where(it => (string) it["name"] == name).FirstOrDefault();
if (itemJson2 != null)
{
differ = quantity - (int) itemJson2["quantity"];
}
json3Array.Add(new JObject() { { "name", name }, { "quantity", quantity }, { "differ", differ } });
}
result = JsonConvert.SerializeObject(json3Array);
}
【问题讨论】:
-
或者您可以使用 Text.Json 或 json.net 对其进行反序列化,让您的生活更轻松。无论如何你必须完全解析它
-
与其写伪代码,我建议你在真实代码中实现你当前的想法,并衡量性能。你说它会有“不好的性能”——这是否意味着你有具体的性能要求?您当前的想法与这些要求相比如何?
-
@JonSkeet,感谢您的评论。输入数据Json1和Json2各有3000-5000多条,用我的方法大概需要2秒,不够好,一定有更好的。我希望不到 1 秒。
-
对,所以大概你现在有实际代码而不是伪代码 - 请用真实代码更新你的问题,并包括你的性能要求方面。
标签: c# arrays json performance subtraction