c#排序JSON字符串键
本文关键字:字符串 JSON 排序 | 更新日期: 2023-09-27 17:54:41
我想转换JSON字符串
"{ '"birthday'": '"1988-03-18'", '"address'": { '"state'": 24, '"city'": 8341, '"country'": 1 } }"
"{ '"address'": { '"city'": 8341, '"country'": 1, '"state'": 24 }, '"birthday'": '"1988-03-18'" }"
注意:我不使用排序版本进行通信(因为键顺序并不重要),我需要一个排序版本来执行本地测试(通过比较JSON字符串)。
EDIT: I4V指出了一个使用Json的解决方案。Net,我宁愿使用不需要包含任何第三方库的解决方案(实际上我使用内置的系统。Json在我的应用程序)
我在这里发布了I4V +一些测试提供的解决方案的要点。谢谢大家。
我使用Json。Net for this
string json = @"{ ""birthday"": ""1988-03-18"", ""address"": { ""state"": 24, ""city"": 8341, ""country"": 1 } }";
var jObj = (JObject)JsonConvert.DeserializeObject(json);
Sort(jObj);
string newJson = jObj.ToString();
void Sort(JObject jObj)
{
var props = jObj.Properties().ToList();
foreach (var prop in props)
{
prop.Remove();
}
foreach (var prop in props.OrderBy(p=>p.Name))
{
jObj.Add(prop);
if(prop.Value is JObject)
Sort((JObject)prop.Value);
}
}
编辑
尝试System.Json
,但我不确定OrderByDescending
(或OrderBy
)。
var jObj = (System.Json.JsonObject)System.Json.JsonObject.Parse(json);
Sort2(jObj);
var newJson = jObj.ToString();
void Sort2(System.Json.JsonObject jObj)
{
var props = jObj.ToList();
foreach (var prop in props)
{
jObj.Remove(prop.Key);
}
foreach (var prop in props.OrderByDescending(p => p.Key))
{
jObj.Add(prop);
if (prop.Value is System.Json.JsonObject)
Sort2((System.Json.JsonObject)prop.Value);
}
}
我知道这可能有点晚了,但是,如果您也需要对数据的内部数组进行排序(我只是需要它):
static void Sort(JObject jObj)
{
var props = jObj.Properties().ToList();
foreach (var prop in props)
{
prop.Remove();
}
foreach (var prop in props.OrderBy(p => p.Name))
{
jObj.Add(prop);
if (prop.Value is JObject)
Sort((JObject)prop.Value);
if (prop.Value is JArray)
{
Int32 iCount = prop.Value.Count();
for (Int32 iIterator = 0; iIterator < iCount; iIterator++)
if (prop.Value[iIterator] is JObject)
Sort((JObject)prop.Value[iIterator]);
}
}
}
干杯!
通过使用这种方法,您可以使用json数据检索动态对象
在DynamicJsonConverter
创建一个SortedDictionary
代替
var d = new SortedDictionary<string, object>(dictionary);
// TODO: code to sort inner objects
return new DynamicJsonObject(d);
那么你可以使用
string jsonStr = "{'"B'":'"2'",'"A'":'"1'"}";
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() });
dynamic json = jss.Deserialize(jsonStr, typeof(object)) as dynamic;
string result = new JavaScriptSerializer().Serialize((json as DynamicJsonObject).Dictionary);
和result
将有预期的输出