Десериализация безымянного массива

#c# #json.net #xamarin.forms

#c# #json.net #xamarin.forms

Вопрос:

У меня возникают трудности с написанием соответствующих аннотаций для представления данных, которые возвращаются из запроса Get в формате JSON, который возвращает данные следующим образом:

 [{"ProductCode":"0129923083091","Description":"DIESEL ","SalesLitres":6058.7347,"SalesValue":6416.2000},{"ProductCode":"0134039344902","Description":"UNLEADED ","SalesLitres":3489.8111,"SalesValue":3695.7100},
... 
]
  

(многоточие выше просто указывает на то, что я мог бы возвращать переменное количество этих элементов)

В моем классе модели (я использую подход MVVM для проекта Xamarin, но здесь это не слишком актуально) Я использую аннотации для представления атрибутов модели

  namespace App8.Models
    {

        public class ReportRow
        {
            [JsonProperty("ProductCode")]
            public string ProductCode { get; set; } = string.Empty;

            [JsonProperty("Description")]
            public string Description { get; set; } = string.Empty;

            [JsonProperty("SalesLitres")]
            public double SalesLitres { get; set; } = 0.0;

            [JsonProperty("SalesValue")]
            public double SalesValue { get; set; } = 0.0;    
        }
    }
  

Я хотел бы отметить другой класс, который показывает связь между контейнером и содержимым. Тем не менее, я отклеился, поскольку в аннотации нет атрибута JSON для представления «корня» возвращаемой коллекции.

У меня не было бы проблем с сопоставлением JSON с объектной моделью для любых массивов JSON, имена которых указаны в возвращаемом JSON. В этом случае я мог бы создать другой класс с именованным атрибутом JSON, который содержал бы список C #, но я пытаюсь предоставить соответствующее отображение модели для JSON, которое возвращает список элементов в безымянном массиве.

Есть идеи, как я мог бы подойти к этому?

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

1. Поздравляю с хорошо сформулированным первым вопросом!

Ответ №1:

Чтобы десериализовать этот JSON, используйте:

 JsonConvert.DeserializeObject<List<ReportRow>>(json)
  

(или любой другой вариант, который вы пожелаете, ключ здесь запрашивает десериализацию ICollection ReportRow . Это может быть ваша собственная реализация класса ICollection или любой из встроенных)

Та же идея следует JsonTextReader или любым другим средствам десериализации JSON.NET предложения. Просто используйте a ICollection<YourType> в качестве целевого типа.

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

1. Спасибо, Кролтан. Похоже, я делаю это правильно, так как это то, что я делаю для его десериализации. Мои проблемы находятся дальше по стеку, поэтому в формах Xamarin и как я привязываюсь к этому списку в viewmodel и т. Д. Это, по крайней мере, помогает мне подтвердить, что я использую правильный подход к десериализации JSON.

2. @user6911358 Да, обычно это правильный подход к десериализации корневых массивов. Если вам действительно нужен свой собственный тип (например, для реализации пользовательского интерфейса), вы можете просто подклассировать List<T> тип или какую-либо другую коллекцию. Даже реализуйте свой собственный, если это действительно необходимо. Но, скорее всего, этого не должно быть. Отправьте еще один вопрос с вашими сомнениями в Xamarin и свяжите его здесь.

3. Вы заслуживаете 1000 голосов 🙂