如何使用JSON.NET反序列化为嵌套/递归Dictionary和List

本文介绍了一种处理复杂JSON数据的方法,包括将其反序列化为.NET容器,并提供了一个用于排序JSON字段的实用程序,确保所有层级的数据都能按字母顺序排列。

将复杂的 JSON blob 反序列化为标准 .NET 容器?

一个可以处理任意 JSON 并将其转换为常规 .NET 类型(primitives(值类型)、列表和字典)的嵌套结构的通用方法:

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

public static class JsonHelper
{
    public static object Deserialize(string json)
    {
        return ToObject(JToken.Parse(json));
    }

    public static object ToObject(JToken token)
    {
        switch (token.Type)
        {
            case JTokenType.Object:
                return token.Children<JProperty>()
                            .ToDictionary(prop => prop.Name,
                                          prop => ToObject(prop.Value));

            case JTokenType.Array:
                return token.Select(ToObject).ToList();

            default:
                return ((JValue)token).Value;
        }
    }
}

您可以调用如下所示的方法。 obj将包含Dictionary<string, object>List<object>或primitive(值类型),具体取决于您开始使用的 JSON。

object obj = JsonHelper.Deserialize(jsonString);

JSON字串排序

如果想要对JSON里面的栏位进行由小到大排序,如

{"A":"111","C":"222","B":"333"}

排序为

{"A":"111","B":"333","C":"222"}

但是遇到了像这样的JSON

{
  "A": "111",
  "C": "222",
  "B": [
    {
      "CC": "我是CC"
      "AA": "我是AA",
    },
    {
      "BB": "我是BB",
      "DD": "我是DD"
    }
  ]
}

如果用上面的程式去跑,会产生这样结果

{
  "A": "111",
  "B": [
    {
      "CC": "我是CC",
      "AA": "我是AA"
    },
    {
      "BB": "我是BB",
      "DD": "我是DD"
    }
  ],
  "C": "222"
}

ABCD是排序了没错,但是B里面的AA、CC却没有

那就动手改一下程式吧

/// <summary>
/// 排序JObject
/// </summary>
/// <param name="Obj"></param>
public static void Sort(JObject Obj)
{
    var properties = Obj.Properties().ToList();
    foreach (var prop in properties) //如果不先清空,等等的Obj.Add会报错
    {
        prop.Remove();
    }

    foreach (var prop in properties.OrderBy(p => p.Name))
    {
        Obj.Add(prop);
        if (prop.Value is JObject)
            Sort((JObject)prop.Value);
        else if (prop.Value is JArray)
            prop.Value = SortJArray((JArray)prop.Value);
    }
}


/// <summary>
/// 排序JArray
/// </summary>
/// <param name="Obj"></param>
public static JArray SortJArray(JArray Obj)
{
    JArray SortJArray = new JArray();
    Dictionary<string, string> dict;
    foreach (JObject o in Obj.Children<JObject>())
    {
        dict = new Dictionary<string, string>();
        foreach (JProperty p in o.Properties())
        {
            dict.Add(p.Name, (string)p.Value);
        }
        var sortdict = dict.OrderBy(x => x.Key).ToDictionary(q => q.Key, p => p.Value);
        JToken jtoken = JToken.FromObject(sortdict);
        SortJArray.Add(jtoken);
    }           
    return SortJArray;
}

想法是,将每个JArray的值填入Dictionary,再由Dictionary排序

最后将prop取出转成JToken存入新的JArray再做回传

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值