Схема JSON: позволяет хранить информацию в ключах

#json #jsonschema

#json #jsonschema

Вопрос:

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

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

Создание скинов — уровень 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 от Newton-King позволила бы мне анализировать профессии в виде словаря, но для этого мне потребовалось бы вручную ввести код типа для сопоставления этого JSON. Поэтому пока я склоняюсь к варианту № 2, но я открыт для предложений.

Ответ №1:

Переименуйте профессию в name, чтобы она выглядела как:

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

Затем, после ее сериализации в клиентской модели, будет выглядеть следующим образом:

 profession = character.professions[0]
profession.name
=> "Skinning"
  

Ответ №2:

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

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

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