在 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。但是您可以使用 JArrayToObject 方法检查类型并转换回 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[]>();
                }
            }
        }

Fiddle