Порядок сериализованных полей с использованием JSON.NET - PullRequest
114 голосов
/ 26 июля 2010

Есть ли способ указать порядок полей в сериализованном объекте JSON, используя JSON.NET ?

Было бы достаточно указать, что одно поле всегда появляется первым.

Ответы [ 13 ]

0 голосов
/ 06 июля 2012

Следующий рекурсивный метод использует отражение для сортировки внутреннего списка токенов в существующем экземпляре JObject вместо создания нового отсортированного графа объектов.Этот код опирается на внутренние детали реализации Json.NET и не должен использоваться в производстве.

void SortProperties(JToken token)
{
    var obj = token as JObject;
    if (obj != null)
    {
        var props = typeof (JObject)
            .GetField("_properties",
                      BindingFlags.NonPublic | BindingFlags.Instance)
            .GetValue(obj);
        var items = typeof (Collection<JToken>)
            .GetField("items", BindingFlags.NonPublic | BindingFlags.Instance)
            .GetValue(props);
        ArrayList.Adapter((IList) items)
            .Sort(new ComparisonComparer(
                (x, y) =>
                {
                    var xProp = x as JProperty;
                    var yProp = y as JProperty;
                    return xProp != null && yProp != null
                        ? string.Compare(xProp.Name, yProp.Name)
                        : 0;
                }));
    }
    foreach (var child in token.Children())
    {
        SortProperties(child);
    }
}
0 голосов
/ 06 августа 2010

Я последовал за вызовом метода JsonConvert.SerializeObject(key) через отражение (где ключом был IList) и обнаружил, что вызывается JsonSerializerInternalWriter.SerializeList.Он принимает список и проходит через

for (int i = 0; i < values.Count; i++) { ...

, где values ​​- это введенный параметр IList.

Краткий ответ ... Нет, встроенногоспособ установить порядок, поля перечислены в строке JSON.

0 голосов
/ 26 июля 2010

Нет порядка полей в формате JSON, поэтому определение порядка не имеет смысла.

{ id: 1, name: 'John' } эквивалентно { name: 'John', id: 1 } (оба представляют строго эквивалентный экземпляр объекта)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...