在 JSON 中反序列化数组中的数组
Deserialize an array within an array in JSON
我有以下 JSON 文件,我想将其反序列化为对象
{
"InputFileFolder": "D:\MontlyTransactions\",
"TransactionGroups":
[
{
"Name": "Income",
"FilterString": "Type=@0 and Amount>@1 and (Description.Contains(@2) or Description.Contains(@3))",
"Arguments": ["BAC",0,"REF1","REF2"]
},
{
"Name": "Household Bills",
"FilterString": "Type=@0 and Amount<@1 and Amount.Contains(@2)",
"Arguments": ["S/O",0,[16600,72000,15000]]
}
]
}
我要转换成的对象如下:
public class Configuration
{
public string InputFileFolder { get; set; }
public TransactionGroup[] TransactionGroups { get; set; }
}
public class TransactionGroup
{
public string Name { get; set; }
public string FilterString { get; set; }
public string[] Arguments { get; set; }
}
使用以下代码段:
this.Configuration = JsonConvert.DeserializeObject<Configuration>(configurationString);
然而,第二个参数中的数组作为 Newtonsoft.Json.Linq.Array 而不是我所期望的对象 [] 返回。
如有任何建议,我们将不胜感激。
您需要先检查 Json 中的 Arguement 元素。例如,来自 OP
中给出的 Json
'Arguments': ['BAC',0,'REF1','REF2']
和
'Arguments': ['S/O',0,[16600,72000,15000]]
如您所见,所涉及的元素不是字符串数组。事实上,它还包含字符串、数字和数字的子数组。
因此您需要将 class 定义更改为
public class TransactionGroup
{
public string Name { get; set; }
public string FilterString { get; set; }
public object[] Arguments { get; set; } // Change here
}
这将帮助您成功反序列化 Json。
即使您将数据类型更改为:public object[] Arguments { get; set; }
,它也会被序列化为 JArray
。但是您可以使用 JArray
的 ToObject
方法检查类型并转换回 object[]
或 string[]
,如下所示:
foreach (var tg in result.TransactionGroups)
{
for (var i = 0; i < tg.Arguments.Length; i++)
{
var arrArg = tg.Arguments[i];
if (arrArg is JArray realArr)
{
tg.Arguments[i] = realArr.ToObject<string[]>();
}
}
}
我有以下 JSON 文件,我想将其反序列化为对象
{
"InputFileFolder": "D:\MontlyTransactions\",
"TransactionGroups":
[
{
"Name": "Income",
"FilterString": "Type=@0 and Amount>@1 and (Description.Contains(@2) or Description.Contains(@3))",
"Arguments": ["BAC",0,"REF1","REF2"]
},
{
"Name": "Household Bills",
"FilterString": "Type=@0 and Amount<@1 and Amount.Contains(@2)",
"Arguments": ["S/O",0,[16600,72000,15000]]
}
]
}
我要转换成的对象如下:
public class Configuration
{
public string InputFileFolder { get; set; }
public TransactionGroup[] TransactionGroups { get; set; }
}
public class TransactionGroup
{
public string Name { get; set; }
public string FilterString { get; set; }
public string[] Arguments { get; set; }
}
使用以下代码段:
this.Configuration = JsonConvert.DeserializeObject<Configuration>(configurationString);
然而,第二个参数中的数组作为 Newtonsoft.Json.Linq.Array 而不是我所期望的对象 [] 返回。
如有任何建议,我们将不胜感激。
您需要先检查 Json 中的 Arguement 元素。例如,来自 OP
中给出的 Json 'Arguments': ['BAC',0,'REF1','REF2']
和
'Arguments': ['S/O',0,[16600,72000,15000]]
如您所见,所涉及的元素不是字符串数组。事实上,它还包含字符串、数字和数字的子数组。
因此您需要将 class 定义更改为
public class TransactionGroup
{
public string Name { get; set; }
public string FilterString { get; set; }
public object[] Arguments { get; set; } // Change here
}
这将帮助您成功反序列化 Json。
即使您将数据类型更改为:public object[] Arguments { get; set; }
,它也会被序列化为 JArray
。但是您可以使用 JArray
的 ToObject
方法检查类型并转换回 object[]
或 string[]
,如下所示:
foreach (var tg in result.TransactionGroups)
{
for (var i = 0; i < tg.Arguments.Length; i++)
{
var arrArg = tg.Arguments[i];
if (arrArg is JArray realArr)
{
tg.Arguments[i] = realArr.ToObject<string[]>();
}
}
}