如何从Json到List获取所有Object

时间:2015-11-17 03:36:57

标签: c# json windows windows-runtime winrt-xaml

来自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进行动态更改,因此我不知道如何执行此操作...

由于

2 个答案:

答案 0 :(得分:0)

根据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);

答案 1 :(得分:0)

最里面的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; }
}