【问题标题】:JSON - Jagged Array DeserializationJSON - 锯齿状数组反序列化
【发布时间】:2021-01-20 03:13:47
【问题描述】:

我确实有一个问题,可能是初学者的问题,但对 JSON 不是很熟悉。但是,我尝试使用 C# Newtonsoft.Json 反序列化下面的 JSON,但是,它一直失败,谁能告诉我如何反序列化它以及如何在 C# 中建模?

[
    {
        "fields": [
            [
                "name",
                "value",
                "values",
                "error"
            ],
            [
                "correspondsApi",
                "N",
                null,
                ""
            ],
            [
                "username",
                "test@test.com",
                null,
                ""
            ],
            [
                "password",
                "",
                null,
                ""
            ],
            [
                "accountid",
                "",
                null,
                ""
            ],
            [
                "rememberMe",
                "Y",
                null,
                ""
            ],
            [
                "language",
                "en-US",
                null,
                ""
            ],
            [
                "S",
                "tokenValue",
                null,
                null
            ],
            [
                "authToken",
                "",
                null,
                ""
            ]
        ],
        "success": "Y",
        "message": "Access is granted"
    }
]

以下是我尝试过的不断抛出异常的代码: 型号:

public class MyArray
    {
        public List<List<string>> fields { get; set; }
        public string success { get; set; }
        public string message { get; set; }
    }

    public class Root
    {
        public List<MyArray> MyArray { get; set; }
    }

代码:

using Newtonsoft.Json;

static void Main(string[] args)
{     
   string jsonContent = "[{\"fields\":[[\"name\",\"value\",\"values\",\"error\"],[\"correspondsApi\",\"N\",null,\"\"],[\"username\",\"test@test.com\",null,\"\"],[\"password\",\"\",null,\"\"],[\"accountid\",\"\",null,\"\"],[\"rememberMe\",\"Y\",null,\"\"],[\"language\",\"en-US\",null,\"\"],[\"S\",\"tokenValue\",null,null],[\"authToken\",\"\",null,\"\"]], \"success\":\"Y\",\"message\":\"Access is granted\"}]";
            JsonConvert.DeserializeObject<Root>(jsonContent);
            
}     

例外:

Newtonsoft.Json.JsonSerializationException: '无法反序列化 当前 JSON 数组(例如 [1,2,3])转换为“LearningOnly.Root”类型 因为该类型需要一个 JSON 对象(例如 {"name":"value"}) 正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为 实现集合接口的数组或类型(例如 ICollection, IList) 之类的可以从 JSON 反序列化的 List 大批。 JsonArrayAttribute 也可以添加到类型中以强制它 从 JSON 数组反序列化。路径'',第 1 行,位置 1。'

【问题讨论】:

标签: c# json json.net deserialization jagged-arrays


【解决方案1】:

我运行了你的 json https://json2csharp.com/

回答您的问题:“它必须如何在 C# 中建模?”

public class MyArray    {
    public List<List<string>> fields { get; set; } 
    public string success { get; set; } 
    public string message { get; set; } 
}

public class Root    {
    public List<MyArray> MyArray { get; set; } 
}

【讨论】:

  • 你好 Syp_dino。我实际上尝试了该解决方案,但它没有成功,它给了我这个错误:Newtonsoft.Json.JsonSerializationException:'无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型'LearningOnly.Root'因为该类型需要一个 JSON 对象(例如 {"name":"value"})才能正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型
【解决方案2】:

您的 json 和对象不匹配。要使用Root,您需要像{MyArray: [...]} 这样的json,即具有MyArray 属性的对象包含一个数组。但你没有。您实际上想使用:

JsonConvert.DeserializeObject<List<MyArray>>(jsonContent);

因为您的根 json 结构是一个数组,即 [{},{}] 不是一个对象。所以你需要把它变成一个枚举器(List&lt;&gt;或者数组等)

这里的工作示例:https://dotnetfiddle.net/zA4VLA

【讨论】:

    猜你喜欢
    • 2019-04-21
    • 2020-04-04
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多