【问题标题】:C# Deserialize JSON arrayC# 反序列化 JSON 数组
【发布时间】:2017-01-18 00:33:35
【问题描述】:

我在反序列化和定义这个 JSON 结构时遇到了问题,如果能得到一些帮助,那就太好了。我已经把它恢复到最后一个已知的工作位置,因为我只是在这里脱轨。

我的 JSON 结构是:

[{
"name": "Name1",
"description": "Description of this process",
"Location": "ANY",
"SubItems": [{
    "name": "sub1",
    "required": true,
    "description": "This is a short description"
}, {
    "name": "sub2",
    "required": true,
    "description": "This is a short description"
}, {
    "name": "sub3",
    "required": true,
    "description": "This is a short description"
}],
"outputs": [{
    "name": "out1",
    "required": false
}, {
    "name": "exit code",
    "required": false
}]
}, {
   "name": "Name2",
   "description": "This is a short description",
   "Location": "ANY",
   "SubItems": [{
       "name": "sub1",
       "required": false,
       "description": "This is a short description"
      }]
   }]

这是我上次工作的 C# Json 定义。

public class JsonObject
{
    [JsonProperty("name")]
    public string ProcessName { get; set; }

    [JsonProperty("description")]
    public string ProcessDescription { get; set; }

    [JsonProperty("Location")]
    public string KnownLocation { get; set; }
}

我目前只捕获几个定义进行测试。

这是我的反序列化对象

var Object = JsonConvert.DeserializeObject <List<JsonObject>>(txt);
            foreach (JsonObject JsonObject in Object)
            {
                Console.WriteLine("Name: " + JsonObject.ProcessName);
                Console.WriteLine();
                Console.WriteLine("Description: " +JsonObject.ProcessDescription);
                Console.WriteLine();
            }

正如我所说,我可以在输出中至少获得前 3 个最顶级的 JSON 元素。当我开始尝试获取“子项”和“输出”时,问题就开始了

我遵循以下链接帖子的结构并努力理解它,但过了一段时间我意识到解决方案不适用于这个问题。我只是有一个多维数组 JSON 对象。从字面上看,有一个顶层和两个子层

我试着去做……

List<List<JsonObject>>Object = JsonConvert.DeserializeObject <List<List<JsonObject>>>(txt);

并尝试使用 3 组 JSON 定义来创建 2 个具有不同名称的相同列表。

并实现了分层的 foreach 循环,但后来我无法访问最顶层 JSON 的定义,并且没有为“SubItems”的实际元素编写任何内容

我真正需要的是到达每个对象。

How to deserialize a json file with multidimensional array to convert it to object in c#

相关问题

【问题讨论】:

  • 看起来你的数组不是多维的,只是你的 JsonObject 里面有一个数组。
  • 那个 JSON 无效。上传到jsonlint.com,你会看到各种错误。你能edit你的问题包含reproduces问题的JSON吗?
  • Raderick,即多维数组的定义。
  • dbc- 我从一个巨大的 JSON 列表中分块出来。我不创建 JSON,也无法控制或编辑它,所以请假设 JSON 格式正确。我对 JSON 没有问题我在解析 C# 中的 JSON 数组对象时遇到问题,所以这更像是一个 C# 编码问题
  • 多维数组:[[0,1],[2,3],[4,5]]。您的代码:[{prop:[0,1]},{prop:[2,3]}]。它不是多维数组。

标签: c# json multidimensional-array


【解决方案1】:

它不是一个多维数组。只是一个包含数组的数组对象。 所以你的模型可以如下

public class SubItem
{
    public string Name { get; set; }
    public bool Required { get; set; }
    public string Description { get; set; }
}

public class Output
{
    public string Name { get; set; }
    public bool Required { get; set; }
}

public class JsonObject
{
    public string Name { get; set; }
    public string Description { get; set; }
    public string Location { get; set; }
    public List<SubItem> SubItems { get; set; }
    public List<Output> Outputs { get; set; }
}

你可以反序列化为

 var obj = JsonConvert.DeserializeObject<List<JsonObject>>(jsonstring);

PS:你可以使用JsonProperty 来装饰你的模型

【讨论】:

  • 您好 L.B,感谢您的解决方案!正如您在上面指出的那样,我实现了这个模型。所以当我运行它时,子项和输出一样是空白的。所以我尝试了一个 foreach 循环,通过 foreach 循环内的 SubItems 中断: System.NullReferenceException: Object reference not set to an instance of an object.
  • 另外,每当我清除 JsonPropery 引用时,我都会返回一个空白列表。
  • 进步!我在主循环中有 2 个 foreach 循环。 foreach(blah obj in Object) { foreach (var Inputs in Object.InputsParams) { //output to console} foreach (var outputs in Object.OutputParams { //output to console} } 然而,我终于得到了一些数据,并非所有这些 Json 对象都有“输出”并且我的代码一直在阻塞。实际上我什至不确定。我只知道输出并不总是存在,甚至在返回的 JSON 模型中也没有列出。未处理的异常:System.NullReferenceException:对象引用不设置为对象的实例。
  • @JeremyWinslow I just know that Outputs dont always exist or even listed in the JSON model in the return 那你为什么不在你写到控制台的代码中添加一个简单的空检查呢?
猜你喜欢
  • 2021-10-13
  • 2017-10-16
  • 2012-09-20
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
相关资源
最近更新 更多