如何将所有对象从 Json 获取到 List

Posted

技术标签:

【中文标题】如何将所有对象从 Json 获取到 List【英文标题】:How to get all Object from Json to List 【发布时间】:2016-02-18 08:07:45 【问题描述】:

我有来自 Xenforo getNodes API 的 Json 代码:

我正在使用 NewtonSoft Json 反序列化到 List 但我不知道如何为这个 json 定义类

希望能得到大家的帮助

 
  "count": 1,
  "nodes": 
    "1": 
      "node_id": 1,
      "title": "Main Category",
      "description": "",
      "node_name": null,
      "node_type_id": "Category",
      "parent_node_id": 0,
      "display_order": 1,
      "display_in_list": 1,
      "lft": 1,
      "rgt": 4,
      "depth": 0,
      "style_id": 0,
      "effective_style_id": 0
    ,

  

因为当您创建新节点时,计数可以从 Xenforo API 动态变化,所以我不知道该怎么做...

谢谢

【问题讨论】:

【参考方案1】:

最里面的 JSON 对象映射到一个简单的 C# 对象,称之为Node;您可以使用http://json2csharp.com/ 为您生成此类。 "nodes" 对象看起来有一组可变的属性,其名称是查找键,其值是先前定义的 Node。然后,所有这些都包含在根对象中。

因此:

public class Node

    public int node_id  get; set; 
    public string title  get; set; 
    public string description  get; set; 
    public object node_name  get; set; 
    public string node_type_id  get; set; 
    public int parent_node_id  get; set; 
    public int display_order  get; set; 
    public int display_in_list  get; set; 
    public int lft  get; set; 
    public int rgt  get; set; 
    public int depth  get; set; 
    public int style_id  get; set; 
    public int effective_style_id  get; set; 


public class RootObject

    public int count  get; set; 
    public Dictionary<string, Node> nodes  get; set; 

【讨论】:

谢谢...我正在使用 Windows.DAta.Json 和复杂的 Json.net 然后没问题!我会试试你的解决方案:)【参考方案2】:

根据API document,“nodes”元素不是标准的 json 数组格式,因此您可能希望像这样使用自定义 JsonConverter

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class NodesConverter : JsonConverter

    public override bool CanConvert(Type objectType)
    
        return objectType == typeof(Node[]);
    

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    
        var nodes = new List<Node>();

        foreach (JProperty property in serializer.Deserialize<JObject>(reader).Properties())
        
            var node = property.Value.ToObject<Node>();
            // parse names as node_number
            node.node_number = int.Parse(property.Name);
            nodes.Add(node);
        

        return nodes.ToArray();
    

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    
    

那么就可以对json文本进行反序列化如下:

public class XenNode

    public int count  get; set; 
    [JsonConverter(typeof(NodesConverter))]
    public Node[] Nodes  get; set; 

public class Node

    public int node_number  get; set; 
    public int node_id  get; set; 
    public string title  get; set; 
    public string description  get; set; 
    public string node_name  get; set; 
    public string node_type_id  get; set; 
    public int parent_node_id  get; set; 
    public int display_order  get; set; 
    public int display_in_list  get; set; 
    public int lft  get; set; 
    public int rgt  get; set; 
    public int depth  get; set; 
    public int style_id  get; set; 
    public int effective_style_id  get; set; 


// Deserialize
XenNode xenNode = JsonConvert.DeserializeObject<XenNode>(json);

【讨论】:

以上是关于如何将所有对象从 Json 获取到 List的主要内容,如果未能解决你的问题,请参考以下文章

如何将有关从通道获取的消息的信息放入 JSON 文件?

ReactJS - 从 URL 获取 json 对象数据

如何从 JSON 对象中获取特定的键值

Flutter 从列表中获取所有数据到 json

如何从 GraphQL API 调用中获取 JSON 对象元素? [关闭]

如何使用 SwiftyJSON 从 JSON 对象中获取 JSON 密钥?