首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用子项目反序列化json

用子项目反序列化json
EN

Stack Overflow用户
提问于 2017-01-12 15:01:42
回答 2查看 1K关注 0票数 0

必须从API调用反序列化JSON。在下面发布JSON蒸汽。必须得到每个“区域”节点。请注意,其中有些有孩子的孩子(这是我遇到的麻烦)。昨天这个时候之前,我甚至不知道JSON是什么(说我已经出去一段时间了)。

我已经知道的是:是否让Netwonsoft.Json引用将其转换为XML以查看这是否有帮助,但认为保留JSON会有更好的性能。

vb.net类具有以下属性: Area_Name作为字符串(JSON中的"ID“)、Area_ID作为字符串(JSON中的”名称“)、Parent_ID作为字符串(在JSON中为父”ID“)

因此,需要知道从哪里开始从下面的JSON中提取所有节点。-JSON流

代码语言:javascript
复制
{"areas":
    [{"id":"1353331688024941487","name":"NGT","children":
        [{"id":"1353331688024941488","name":"Other","children":
            [
             {"id":"1353331688024941489","name":"Independence Office","children":[]},
             {"id":"1353331688024941490","name":"Lordstown Pipe Receipt Site (PRS)","children":[]},
             {"id":"1353331688024941491","name":"Marion Pipe Receipt Site (PRS)","children":[]},
             {"id":"1353331688024941492","name":"Marion Warehouse Facility","children":[]},
             {"id":"1353331688024941493","name":"Port of Toledo Pipe Receipt Site (PRS)","children":[]},
             {"id":"1353331688024941494","name":"Spread -1 - No facility","children":[]},
             {"id":"1353331688024941495","name":"Spread -2 - Wadsworth Office","children":[]},
             {"id":"1353331688024941496","name":"Spread -3 - Toledo Office","children":[]},
             {"id":"1353331688024941497","name":"Spread -4 - Dundee Office","children":[]}
            ]
         },
         {"id":"1353331688024941498","name":"Spread-1","children":
            [
            {"id":"1353331688024941499","name":"Compressor Station 1","children":[]},
            {"id":"1353331688024941500","name":"Field Inspectors 1","children":[]},
            {"id":"1353331688024941501","name":"Meter Station 1","children":[]},
            {"id":"1353331688024941502","name":"Meter Station 2","children":[]},
            {"id":"1353331688024941503","name":"Meter Station 3","children":[]},
            {"id":"1353331688024941504","name":"NDE Testing 1","children":[]},
            {"id":"1353331688024941505","name":"Pipeline 1","children":[]},
            {"id":"1353331688024941506","name":"Wareyard 1-1","children":[]}
            ]
         },
        {"id":"1353331688024941507","name":"Spread-2","children":
            [
             {"id":"1353331688024941508","name":"Compressor Station 2","children":[]},
             {"id":"1353331688024941509","name":"Field Inspectors 2","children":[]},
             {"id":"1353331688024941510","name":"Meter Station 5","children":[]},
             {"id":"1353331688024941511","name":"NDE Testing 2","children":[]},
             {"id":"1353331688024941512","name":"Pipeline 2","children":[]},
             {"id":"1353331688024941513","name":"Wareyard 2-1","children":[]}
            ]
        },
        {"id":"1353331688024941514","name":"Spread-3","children":
            [
             {"id":"1353331688024941515","name":"Compressor Station 3","children":[]},
             {"id":"1353331688024941516","name":"Compressor Station 4","children":[]},
             {"id":"1353331688024941517","name":"Field Inspectors 3","children":[]},
             {"id":"1353331688024941518","name":"Meter Station 6","children":[]},
             {"id":"1353331688024941519","name":"NDE Testing 3","children":[]},
             {"id":"1353331688024941520","name":"Pipeline 2","children":[]},
             {"id":"1353331688024941521","name":"Wareyard 3-1","children":[]}
            ]
        },
        {"id":"1353331688024941522","name":"Spread-4","children":
            [
             {"id":"1353331688024941523","name":"Field Inspectors 4","children":[]},
             {"id":"1353331688024941524","name":"Meter Station 4","children":[]},
             {"id":"1353331688024941525","name":"NDE Testing 4","children":[]},
             {"id":"1353331688024941526","name":"Pipeline 4","children":[]},
             {"id":"1353331688024941527","name":"Wareyard 4-1","children":[]},
             {"id":"1353331688024941528","name":"Wareyard 4-3","children":[]},
             {"id":"1353331688024941529","name":"Wareyard 4-4","children":[]}

            ]
        }
    ]
    }
    ]
}

谢谢谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-12 15:32:07

您需要多一个类"AreaModel“,其中包含一个属性”区域“。因此,您的类应该如下所示。

代码语言:javascript
复制
public class AreaModel
{
    public List<Area> Areas { get; set; }
}
public class Area
{
    [JsonProperty(PropertyName = "id")]
    public string Area_Name 
    {
        get;
        set;
    }

    [JsonProperty(PropertyName = "name")]
    public string Area_ID {get;set;}

    [JsonProperty(PropertyName= "children")]
    public List<Area> Children 
    { 
        get;set;
    }
}

然后,您可以按以下方式反序列化JSON字符串。

代码语言:javascript
复制
var areaModel = JsonConvert.DeserializeObject<AreaModel>(areaJSON);

foreach (var area in areaModel.Areas)
{
    DisplayAreas(area);
}

private static void DisplayAreas(Area area)
{
    Console.WriteLine(area.Area_Name);
    if(area.Children != null && area.Children.Count > 0)
    {
        foreach(var child in area.Children)
        {
            DisplayAreas(child);
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-01-12 15:55:29

Visual将创建您需要的类,或者您可以使用在线机器人。在VS中,使用剪贴板上的JSON,编辑 -> 粘贴特殊 -> ,将JSON粘贴为类

这两个类都比较密集,因为它们不会认识到Child类实际上是相同的,您可以对两者使用相同的类。实际上,-- AreaChild类--也是相同的:

代码语言:javascript
复制
Public Class AreaContainer
    Public Property areas As AreaItem()
End Class

Public Class AreaItem
    Public Property id As String
    Public Property name As String
    Public Property children As AreaItem()    ' no need for a Child1
End Class

反序列化:

代码语言:javascript
复制
Dim jstr = ...wherever you get it
Dim myareas = JsonConvert.DeserializeObject(Of AreaContainer)(jstr)

我不知道你想要什么,但这会打印出NGT.Other孩子的名字和他们的孩子的数量。

代码语言:javascript
复制
For n As Int32 = 0 To myareas.areas(0).children(0).children.Count - 1
    Console.WriteLine("Name {0}    => children: {1}",
                        myareas.areas(0).children(0).children(n).name,
                        myareas.areas(0).children(0).children(n).children.Count)
Next

名称独立办公室=>儿童:0 Lordstown管道接收站点(PRS) =>子站点名称:0 =>儿童名称:0 命名设施=>儿童:0 名称托莱多管道接收站(PRS) =>子站点:0 名称传播-1 -没有设施=>儿童:0 名称传播-2 -沃兹沃思办公室=>儿童:0 名称传播-3 -托莱多办公室=>儿童:0 名称传播-4 -邓迪办公室=>儿童:0

  • 一旦有了类,Intellisense将帮助您导航结构。
  • “局部变量”窗口还将展开集合,并帮助“查看”如何获取不同的数据元素。

如这里的其他文章所示,您可以通过首先解析JSON,将areas部分反序列化为数组,从而简化代码必须处理的结果对象。它删除了myAreas变量和AreaContainer类,这两个类都没有什么用处。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41616369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档