Post-запрос с массивом JSON — не удается отправить в надлежащем формате

#c# #json

#c# #json

Вопрос:

У меня есть следующий JSON, который мне нужно отправить в API:

 {
  "arch": {
    "id": “TrackingCode”
  },
  "nails": [{
    "name": "John"
  }],

  "token": 'RandomCode'
}
  

Итак, я определяю данные таким образом:

 public class arch
{
    [JsonProperty("id")]
    public string id { get; set; }
}

public class nails
{
    [JsonProperty("name")]
    public string[] name { get; set; }
}

public class Parameter
{
    [JsonProperty("arch")]
    public arch arch { get; set; }

    [JsonProperty("nails")]
    public nails nails{ get; set; }

    [JsonProperty("token")]
    public string token { get; set; }
}
  

Вот как я инициализирую JSON перед его сериализацией:

 Parameter json = new Parameter
{
    arch = new arch
    {
        id = TrackingId
    },

    nails = new nails
    {
       name = "John"
    }

   token = "randomstuff"
};
  

Но есть ошибка синтаксиса / форматирования, связанная с полем «name», которое не допускает компиляцию. Очевидно, что это структура массива этого элемента. Что я делаю неправильно с точки зрения синтаксиса?

Комментарии:

1. nails — это не массив, это объект в вашем определении. Вместо этого вы могли бы попробовать определить nails как nails[], а затем заполнить его как таковой.

Ответ №1:

В вашем параметре object измените nails nails на либо nails[] , либо IEnumerable<nail> nails . Причина, по которой ваш json выходит не так, как вам хотелось бы, заключается в том, что nails — это объект, поэтому единственная сущность, а массив — это несколько сущностей, как вы и предполагали

Ответ №2:

Что касается предоставленного вами кода, ошибка компиляции заключается в том, что вы определили name как массив строк, но затем пытаетесь присвоить ему строку. Измените на массив строк, и он будет скомпилирован нормально:

         Parameter json = new Parameter
        {
            arch = new arch
            {
                id = "1"
            },

            nails = new nails
            {
                name = new string[]{"John"}
            },

            token = "randomstuff"
        };
  

Тем не менее, это не соответствовало бы вашему первоначальному требованию, которое заключалось в том, что nails должен быть массивом, а не именем в nails. Итак, вам нужно что-то более похожее:

 public class arch
{
    public string id { get; set; }
}

public class nails
{
    public string name { get; set; }
}

public class Parameter
{
    public arch arch { get; set; }

    public nails[] nails { get; set; }

    public string token { get; set; }
}
  

         Parameter json = new Parameter
        {
            arch = new arch
            {
                id = "1"
            },

            nails = new nails[]
            {
                new nails(){name = "John"}
            },

            token = "randomstuff"
        };
  

Ответ №3:

Я рекомендую вам использовать http://json2csharp.com /, это может быть полезно для генерации объектов класса для вашего JSON.

Используя этот инструмент, у вас есть:

 public class Arch
{
    public string id { get; set; }
}

public class Nail
{
    public string name { get; set; }
}

public class Parameter
{
    public Arch arch { get; set; }
    public List<Nail> nails { get; set; }
    public string token { get; set; }
}
  

Как вы можете видеть, name не должно быть array . Вместо nails (массив или список).

Редактировать:

Для инициализации вашего Parameter экземпляра вы можете сделать это следующим образом:

 Parameter json = new Parameter
{
    arch = new Arch
    {
        id = TrackingId
    },

    nails = new List<Nail>
    {
       new Nail { name = "John" }
    },

   token = "randomstuff"
};
  

Комментарии:

1. Это выглядит хорошо! Итак, как этот список гвоздей должен быть заполнен в параметре init?