使用空白数组反序列化 JSON 对象
本文关键字:JSON 对象 反序列化 数组 空白 | 更新日期: 2023-09-27 18:34:22
当存在空/空属性(使用 JSON.NET(时,我在反序列化 JSON 对象时遇到了一点麻烦,并希望有人能为我指出正确的方向。 下面是我正在尝试的代码片段,并一直在dotnetfiddle进行测试
下面是 JSON 的示例:
{
"`LCA0009": [],
"`LCA0001": {
"23225007190002": "1",
"23249206670003": "1",
"01365100070018": "5"
},
"`LCA0003": {
"23331406670018": "1",
"24942506670004": "1"
},
"`LCA0005": {
"01365100070018": "19"
}
}
我正在尝试使用此代码:
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
public class Program
{
public static void Main()
{
string json = "{'"`LCA0009'": [], '"`LCA0001'": {'"23225007190002'": '"1'",'"23249206670003'": '"1'",'"01365100070018'": '"5'"},'"`LCA0003'": {'"23331406670018'": '"1'",'"24942506670004'": '"1'"},'"`LCA0005'": {'"01365100070018'": '"19'"}}";
Console.WriteLine(json);
Console.WriteLine();
Console.WriteLine("This works");
var root = JsonConvert.DeserializeObject(json);
Console.WriteLine(root);
Console.WriteLine("This doesn't work");
var root2 = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, int>>>(json);
Console.WriteLine(root2);
foreach (var locationKvp in root2)
{
foreach (var skuKvp in locationKvp.Value)
{
Console.WriteLine("location: " + locationKvp.Key + ", sku: " + skuKvp.Key + ", qty: " + skuKvp.Value);
}
}
}
}
上面的"不起作用"是我收到此错误:
运行时异常(第 19 行(:无法将当前 JSON 数组(例如 [1,2,3](反序列化为类型"System.Collections.Generic.Dictionary'2[System.String,System.Int32]",因为该类型需要一个 JSON 对象(例如 {"name":"value"}(才能正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"}(,或者将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList(,如可以从 JSON 数组反序列化的列表。还可以将 JsonArrayAttribute 添加到类型中,以强制它从 JSON 数组反序列化。 路径"LCA0009",第 1 行,位置 14。
如何删除具有空/空数组的属性?
从根本上说,JSON 是不一致的,最好的答案是使其保持一致。无论谁给你这个JSON,都需要被告知修复它。
直到/除非你能做到这一点,你可以将"原始"版本转换为自己Dictionary<string, Dictionary<string, int>>
,但这需要更多的工作:
https://dotnetfiddle.net/zdeOOX
string json = "{'"`LCA0009'": [], '"`LCA0001'": {'"23225007190002'": '"1'",'"23249206670003'": '"1'",'"01365100070018'": '"5'"},'"`LCA0003'": {'"23331406670018'": '"1'",'"24942506670004'": '"1'"},'"`LCA0005'": {'"01365100070018'": '"19'"}}";
// Convert it
var root = (JObject)JsonConvert.DeserializeObject(json);
var results = new Dictionary<string, Dictionary<string,int>>();
foreach (var entry in root)
{
var dict = new Dictionary<string,int>();
if (!(entry.Value is JArray))
{
foreach (var subentry in (JObject)entry.Value)
{
int v;
if (int.TryParse(((JValue)subentry.Value).ToString(), out v))
{
dict.Add(subentry.Key, v);
}
}
}
results.Add(entry.Key, dict);
}
// Results:
foreach (var name in results.Keys)
{
var entry = results[name];
Console.WriteLine(name + ":");
foreach (var entryKey in entry.Keys)
{
Console.WriteLine("- " + entryKey + ": " + entry[entryKey]);
}
}
我希望 Linq 可以使其更加优雅。