Как создать объект json по умолчанию из схемы json в С#

Я не могу найти эту вещь в json.net справке по API или где-либо еще. Я хочу создать объект из схемы json с заполненными значениями по умолчанию. В основном что-то вроде этого:

var JsonSchema=JsonSchema.ReadSchemaFromSomeWhere();
dynamic DefaultObject= JsonSchema.GetDefaultObject();

Пример вы можете увидеть в пакете json-schema-defaults.

Пример

var JsonSchema=JsonSchema.ReadSchemaFromString("
{
  "title": "Album Options",
  "type": "object",
  "properties": {
    "sort": {
      "type": "string",
      "default": "id"
    },
    "per_page": {
      "default": 30,
      "type": "integer"
    }
  }");

dynamic DefaultObject= JsonSchema.GetDefaultObject();

//DefaultObject dump is
{
  sort: 'id',
  per_page: 30
}

ОБНОВЛЕНИЕ

Я хочу, чтобы lib или api в json.net создавали объект со значениями по умолчанию из любой допустимой схемы json во время выполнения.


person Kostia Mololkin    schedule 09.03.2016    source источник
comment
как насчет использования «динамического»?   -  person Marty    schedule 09.03.2016
comment
@Marty, поскольку схема может быть произвольной, я думаю, что ее можно создать как динамический объект, или я не знаю экземпляр Jobject или какую-либо еще строку, или какой у вас вопрос?   -  person Kostia Mololkin    schedule 09.03.2016


Ответы (1)


Ну, простой случай может быть таким

[Test]
public void Test()
{
   dynamic ob = new JsonObject();
   ob["test"] = 3;

   Assert.That(ob.test, Is.EqualTo(3));

}

Я использовал библиотеку RestSharp, которая обеспечивает хорошую динамическую реализацию, позволяющую индексировать ["test"];

Итак, что вам осталось сделать, это прочитать свойства из схемы и присвоить значения (конечно, это будет работать только для простых простых случаев, но может быть началом

dynamic ob = new JsonObject();
foreach (var prop in JsonSchema.Properties)
{

   if (prop.Default != null)
      ob[prop.Name] = prop.Default
}
person Marty    schedule 09.03.2016
comment
нет, моя цель не в том, чтобы получить код класса С# для компиляции, я хочу, чтобы во время выполнения на любой заданной схеме json vaiild создавался объект json из него со значениями по умолчанию, поэтому я ищу lib или api в json.net, я обновлю свой вопрос чтобы было понятно извините - person Kostia Mololkin; 09.03.2016
comment
какие будут значения по умолчанию? динамический объект с реквизитами из схемы, установленными в значения NULL? - person Marty; 09.03.2016
comment
null в случае, если в схеме не указано значение по умолчанию для свойства, если указано значение по умолчанию, то оно должно быть там, проверьте пакет узла из рассматриваемой ссылки, он делает то, что я хочу в javascript - person Kostia Mololkin; 09.03.2016
comment
ага, работаю над этим. кажется, что готового решения нет. по крайней мере от НьютонСофт - person Marty; 09.03.2016
comment
спасибо за внимание! Я проверил исходный код js lib - кажется, он не слишком большой и может быть переписан на С#, но все же :) - person Kostia Mololkin; 09.03.2016
comment
Можете ли вы опубликовать URL-адрес источника js lib? - person Marty; 09.03.2016
comment
Я добавил упрощенную реализацию с основным решением, находящимся в библиотеке RestSharp, которая позволяет индексировать свойства, такие как ob[name].. остальное, я думаю, находится в этой библиотеке js или может быть обработано, сделав функцию рекурсивной (свойства - это список объектов схемы) - person Marty; 09.03.2016
comment
спасибо за информацию, да, это хорошая отправная точка, а также рекурсия, она также требует разрешения ссылок - person Kostia Mololkin; 10.03.2016
comment
есть ли прогресс в реализации .net? - person Ivan Yuriev; 31.01.2019
comment
@IvanYuriev мы закончили тем, что реализовали простой рекурсивный метод на клиенте, чтобы сделать это, учитывая количество конструкций спецификации схемы, которые мы поддерживаем, метод довольно прост, и его легко расширить, если вы хотите поддерживать всю спецификацию схемы. - person Kostia Mololkin; 31.01.2019