Как создать необходимый JSON с JSON.net - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь создать этот JSON ниже, используя JSON.Net, но я получил ошибку

Не могу добавить Newtonsoft.Json.Linq.JProperty для Newtonsoft.Json.Linq.JArray

Мне удалось получить вывод до "cpu", но я не могу создать "диски", которые включают массив.

JSON Я пытаюсь сделать:

{
  "spec":{
     "name":"SampleVM",
     "cpu":{
        "hot_remove_enabled":true,
        "count":1,
        "hot_add_enabled":true,
        "cores_per_socket":1
     },
     "disks":[
        {
           "new_vmdk":{
              "capacity":1024
           }
        }
     ]
  }
}

Мой код

JObject newjson =
    new JObject(
        new JProperty("spec", 
            new JProperty("name","SampleVM"),                  
            new JProperty("cpu",new JObject
            { 
            new JProperty("hot_remove_enabled",true),
            new JProperty("count",1),
            new JProperty("hot_add_enabled",true),
            new JProperty("cores_per_socket",1)
            }),

            new JProperty("disks", new JArray(
                new JObject
                {
                    new JProperty("new_vmdk",new JObject{
                        new JProperty("capacity",1024)
                    })
                }
                ))));

Что я могу изменить в своем коде, чтобы получить точно такой же вывод, что и JSON? Моя проблема в основном заключается в попытке воссоздать «диски» JProperty с массивом.

1 Ответ

0 голосов
/ 08 ноября 2019

Ваша проблема здесь:

new JObject(
    new JProperty("spec", 
        new JProperty("name","SampleVM"),
        new JProperty("cpu", // Remainder omitted.

То, что вы делаете здесь, это добавление нескольких JProperty объектов к JProperty. Свойство не может иметь свойства как дети, только объект может иметь свойства как дети.

Возможно, вы хотите, чтобы эти вложенные свойства были инкапсулированы в объект, например:

var newjson =
    new JObject(
    new JProperty("spec", 
                  new JObject(
                      new JProperty("name","SampleVM"),                  
                      new JProperty("cpu",new JObject
                                    { 
                                        new JProperty("hot_remove_enabled",true),
                                        new JProperty("count",1),
                                        new JProperty("hot_add_enabled",true),
                                        new JProperty("cores_per_socket",1)
                                    }),

                      new JProperty("disks", new JArray(
                          new JObject
                          {
                              new JProperty("new_vmdk",new JObject{
                                  new JProperty("capacity",1024)
                              })
                          }
                      )))));    

Демонстрационная скрипка здесь .

Примечания:

  • Вводящее в заблуждение сообщение об ошибке Невозможно добавить Newtonsoft.Json.Linq.JProperty для Newtonsoft.Json.Linq.JArray , кажется,исходят из того факта, что вы пытаетесь добавить множественные свойства к свойству, и в этом случае конструктор JProperty предполагает, что поскольку передается коллекция, из нее следует сделать JArrayвходящие аргументы - и терпит неудачу, так как все аргументы имеют тип JProperty.

    Если я добавлю только одно свойство к свойству, например, так:

    new JObject(
        new JProperty("spec", 
                      new JProperty("name","SampleVM")
                     )
    );
    

    , я получу менее вводящий в заблуждениесообщение Невозможно добавить Newtonsoft.Json.Linq.JProperty в Newtonsoft.Json.Linq.JProperty. Демонстрационная скрипка # 2 здесь .

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