0

我有以下要反序列化为对象的 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 而不是我所期望的 object[] 返回。

任何建议将不胜感激。

4

2 回答 2

0

您需要首先检查 Json 中的 Arguement 元素。例如,来自 OP 中给出的 Json

 'Arguments': ['BAC',0,'REF1','REF2']   

 'Arguments': ['S/O',0,[16600,72000,15000]]

如您所见,所涉及的元素不是字符串数组。事实上,它还包含字符串、数字和数字子数组。

因此,您需要将类定义更改为

public class TransactionGroup
{
    public string Name { get; set; }
    public string FilterString { get; set; }
    public object[] Arguments { get; set; } // Change here
}

这将帮助您成功反序列化 Json。

于 2020-01-03T12:34:51.130 回答
0

即使您将数据类型更改为 :public object[] Arguments { get; set; }它也会被序列化为JArray. 但是您可以检查类型并将其转换回object[]string[]使用如下ToObject方法JArray

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[]>();
                }
            }
        }

小提琴

于 2020-01-03T12:46:18.613 回答