8

JSON文字列を変換したい

"{ \"birthday\": \"1988-03-18\", \"address\": { \"state\": 24, \"city\": 8341, \"country\": 1 } }"

"{ \"address\": { \"city\": 8341, \"country\": 1, \"state\": 24 }, \"birthday\": \"1988-03-18\" }"

注: 通信にはソート済みバージョンを使用していません (キーの順序は重要ではないため)。(JSON 文字列を比較して) ローカル テストを実行するには、ソート済みバージョンが必要です。


編集: I4V はJson.Netを使用するソリューションを指摘しました。サードパーティのライブラリを含める必要のないソリューションを使用したいと思います (実際には、アプリケーションで組み込みの System.Json を使用しています)。


I4V が提供するソリューションといくつかのテストの要点をここに投稿しまし。皆さん、ありがとうございました。

4

3 に答える 3

16

これにはJson.Netを使用します

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についてはわかりません。OrderByDescendingOrderBy

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);
    }
}
于 2013-01-19T18:23:49.500 に答える
3

このアプローチを使用すると、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、期待される出力が得られます。

于 2013-01-19T19:15:08.537 に答える