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

被折叠的 条评论
为什么被折叠?



