C# JSON按key进行排序|C#对JSON字符串排序(KEY/VALUE)

一次在调用百度外卖的接口中需要对JSONMD5,但是前提是JSON必须先排序

1.需要用到的库 JSON.NET

以下是源码

    /// <summary>
    /// JSON对象名称排序  
    /// </summary>
    public class JsonSort
    {
       /// <summary>
       /// JSON格式化重新排序
       /// </summary>
        /// <param name="jobj">原始JSON JToken.Parse(string json);</param>
       /// <param name="obj">初始值Null</param>
       /// <returns></returns>
       public static string SortJson(JToken jobj, JToken obj)
        {
            if (obj == null)
            {
                obj = new JObject();
            }
            List<JToken> list = jobj.ToList<JToken>();
            if (jobj.Type == JTokenType.Object)//非数组
            {
                List<string> listsort = new List<string>();
                foreach (var item in list)
                {
                   string name= JProperty.Load(item.CreateReader()).Name;
                   listsort.Add(name);
                }
                listsort.Sort();
                List<JToken> listTemp = new List<JToken>();
                foreach (var item in listsort)
                {
                    listTemp.Add(list.Where(p=>JProperty.Load(p.CreateReader()).Name==item).FirstOrDefault());
                }
                list = listTemp;
                //list.Sort((p1, p2) => JProperty.Load(p1.CreateReader()).Name.GetAnsi() - JProperty.Load(p2.CreateReader()).Name.GetAnsi());
 
                foreach (var item in list)
                {
                    JProperty jp = JProperty.Load(item.CreateReader());
                    if (item.First.Type == JTokenType.Object)
                    {
                        JObject sub = new JObject();
                        (obj as JObject).Add(jp.Name, sub);
                        SortJson(item.First, sub);
                    }
                    else if (item.First.Type == JTokenType.Array)
                    {
                        JArray arr = new JArray();
                        if (obj.Type == JTokenType.Object)
                        {
                            (obj as JObject).Add(jp.Name, arr);
                        }
                        else if (obj.Type == JTokenType.Array)
                        {
                            (obj as JArray).Add(arr);
                        }
                        SortJson(item.First, arr);
                    }
                    else if (item.First.Type != JTokenType.Object && item.First.Type != JTokenType.Array)
                    {
                        (obj as JObject).Add(jp.Name, item.First);
                    }
                }
            }
            else if (jobj.Type == JTokenType.Array)//数组
            {
                foreach (var item in list)
                {
                    List<JToken> listToken = item.ToList<JToken>();
                    List<string> listsort = new List<string>();
                    foreach (var im in listToken)
                    {
                        string name = JProperty.Load(im.CreateReader()).Name;
                        listsort.Add(name);
                    }
                    listsort.Sort();
                    List<JToken> listTemp = new List<JToken>();
                    foreach (var im2 in listsort)
                    {
                        listTemp.Add(listToken.Where(p => JProperty.Load(p.CreateReader()).Name == im2).FirstOrDefault());
                    }
                    list = listTemp;
 
                    listToken = list;
                   // listToken.Sort((p1, p2) => JProperty.Load(p1.CreateReader()).Name.GetAnsi() - JProperty.Load(p2.CreateReader()).Name.GetAnsi());
                    JObject item_obj = new JObject();
                    foreach (var token in listToken)
                    {
                        JProperty jp = JProperty.Load(token.CreateReader());
                        if (token.First.Type == JTokenType.Object)
                        {
                            JObject sub = new JObject();
                            (obj as JObject).Add(jp.Name, sub);
                            SortJson(token.First, sub);
                        }
                        else if (token.First.Type == JTokenType.Array)
                        {
                            JArray arr = new JArray();
                            if (obj.Type == JTokenType.Object)
                            {
                                (obj as JObject).Add(jp.Name, arr);
                            }
                            else if (obj.Type == JTokenType.Array)
                            {
                                (obj as JArray).Add(arr);
                            }
                            SortJson(token.First, arr);
                        }
                        else if (item.First.Type != JTokenType.Object && item.First.Type != JTokenType.Array)
                        {
                            if (obj.Type == JTokenType.Object)
                            {
                                (obj as JObject).Add(jp.Name,token.First);
                            }
                            else if (obj.Type == JTokenType.Array)
                            {
                                item_obj.Add(jp.Name, token.First);
                            }
                        }
                    }
                    if (obj.Type == JTokenType.Array)
                    {
                        (obj as JArray).Add(item_obj);
                    }
 
                }
            }
            string ret = obj.ToString(Formatting.None);
            return ret;
        }
    }

附上源码下载地址:
http://pan.baidu.com/s/1eQLVqUY 密码:nc8w


C#对JSON字符串排序(KEY/VALUE)

public string StortJson(string json)
{
      var dic = JsonConvert.DeserializeObject<SortedDictionary<string, object>>(json);
      SortedDictionary<string, object> keyValues = new SortedDictionary<string, object>(dic);
      keyValues.OrderBy(m => m.Key);//升序 把Key换成Value 就是对Value进行排序
      //keyValues.OrderByDescending(m => m.Key);//降序
      return JsonConvert.SerializeObject(keyValues);
}

需要添加的引用:

using System.Collections.Generic;

using System.Linq;

using Newtonsoft.Json;

C# JSON字符串字典序排序(递归)

#region json字符串字典序排序
public static string SortJson(string json)
{
    var dic = JsonConvert.DeserializeObject<SortedDictionary<string, object>>(json);
    SortedDictionary<string, object> keyValues = new SortedDictionary<string, object>(dic);
    keyValues.OrderBy(m => m.Key);//升序 把Key换成Value 就是对Value进行排序
    //keyValues.OrderByDescending(m => m.Key);//降序
    SortedDictionary<string, object> tempKeyValues = new SortedDictionary<string, object>(keyValues);
    foreach (KeyValuePair<string, object> kv in tempKeyValues)
    {
        // 判断value是不是JObject类型
        Type t0 = typeof(JObject);
        Type t1 = kv.Value.GetType();
        if (t0 == t1) {
            // value是JObject类型
            string jsonItem = JsonConvert.SerializeObject(kv.Value);
            jsonItem = SortJson(jsonItem);
            keyValues[kv.Key] = JsonConvert.DeserializeObject<JObject>(jsonItem);
        }
    }
    return JsonConvert.SerializeObject(keyValues);
}
#endregion

C#-Json字符串字段递归排序

private static dynamic GetSorObject (Object obj)
{
     if (obj is JArray)
     {
         var list = new List<dynamic> ();
         foreach (var item in (obj as JArray))
         {
             list.Add (GetSorObject (item));
         }
         return list;
     }
     else
     {
         var paramDic = JsonConvert.DeserializeObject<Dictionary<string, dynamic>> (JsonConvert.SerializeObject (obj));
         var sortedDic = new SortedDictionary<string, dynamic> ();
         for (int i = 0; i < paramDic.Count; i++)
         {
             if (paramDic.ElementAt (i).Value is JArray || paramDic.ElementAt (i).Value is JObject)
             {
                 sortedDic.Add (paramDic.ElementAt (i).Key, GetSorObject (paramDic.ElementAt (i).Value));
             }
             else
             {
                 sortedDic.Add (paramDic.ElementAt (i).Key, paramDic.ElementAt (i).Value);
             }
         }
         return sortedDic;
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值