Схема JSON: позволяет хранить информацию в ключах - PullRequest
1 голос
/ 13 апреля 2011

Я хочу формально определить схему для протокола на основе JSON. У меня есть два критерия для схемы: 1. Я хочу иметь возможность использовать инструменты для создания парсера / сериализатора (php и .net). 2. Результат JSON должен легко читаться человеком

Вот контекст. Схема будет описывать игрового персонажа, в качестве примера я возьму один аспект профиля - профессии. Персонаж может иметь до 2 профессий (из списка 10), каждая профессия описывается именем и уровнем, например ::100100

Скиннинг - уровень 200 Кузнец - уровень 300

Для удовлетворения критерия # 1 действительно полезно иметь схему XSD (или схему JSON) для управления генератором кода или библиотекой синтаксического анализатора. Но это означает, что мой JSON должен выглядеть примерно так:

character : {
    professions : [ 
        { profession : "Skinning", level : 525 }
        { profession : "Blacksmith", level : 745 }
    ]
}

но это кажется слишком болтливым, я бы предпочел, чтобы JSON выглядел (обратите внимание, что профессия используется в качестве ключа):

character {
    professions : {
        "Skinning" : 525,
        "Blacksmith" : 745 
    }
}

но более поздний JSON не может быть описан с помощью XSD без необходимости определения элемента для каждой профессии.

Итак, я ищу решение для моей ситуации, вот варианты, которые я определил:

  1. заткнись и сделай JSON XSD-дружественным (первый фрагмент выше)
  2. заткнись и сделай JSON понятным для человека и кодируй вручную сериализатором.

но мне бы очень хотелось найти решение, которое бы удовлетворяло обоим критериям.

Примечание: я знаю, что библиотека JSON Ньютона-Кинга позволила бы мне анализировать профессии в качестве словаря, но мне потребовалось бы вручную написать код типа для сопоставления этого JSON. Поэтому пока я склоняюсь к варианту № 2, но я открыт для предложений.

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Переименуйте профессию, чтобы она называлась так:

character : {
    professions : [ 
        { name : "Skinning", level : 525 }
        { name : "Blacksmith", level : 745 }
    ]
}

Тогда после сериализации на клиенте модель будет выглядеть так:

profession = character.professions[0]
profession.name
=> "Skinning"
0 голосов
/ 13 апреля 2011

Ваши варианты, как вы сказали ... 1 заткнись и используй xml 2 заткнись и построй свой собственный

ИЛИ, может быть, 3 ... http://davidwalsh.name/json-validation

Я бы сделал # 1 - потому что xml кажется довольно распространенным способом преобразования содержимого из форматов X => Y - Я предпочитаю работать в C #, а не JS - многие люди используют XML, это общепринятый стандарт, есть много ресурсов, чтобы помочь вам в этом

...