C # повторяет одно и то же имя поля в классе, чтобы разрешить сериализацию в JSON - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь создать класс, который я сериализую, чтобы он стал телом веб-запроса.

Вывод, который я пытаюсь получить при сериализации объекта:

{
  "findCompletedItemsRequest": {
    "keywords": "searchtext",
    "itemFilter": [
      {
        "name": "SoldItemsOnly",
        "value": "true"
      }
    ],
    "outputSelector": "PictureURLLarge",
    "outputSelector": "SellerInfo",
    "paginationInput": {
      "entriesPerPage": "100",
      "pageNumber": "1"
    }
  }
}

Для поля 'outputSelector' я могу указать его 0, 1 или много раз.Как бы я определил это в моем классе?Я пытался искать, но я не уверен, что то, что я пытаюсь достичь, может быть названо.Если я использую список или массив, он просто создает свойство JSON для outputSelect, в котором есть массив, а не несколько свойств outputSelector.

Вот что у меня есть (другая критика приветствуется, поскольку я из процедурного программирования)фон)

public class eBaySearchBody
        {
            public FindCompletedItemsRequest findCompletedItemsRequest = new FindCompletedItemsRequest();
            public class FindCompletedItemsRequest
            {
                public string keywords { get; set; }
                public List<itemFilters> itemFilter { get; set; }
                public string sortOrder { get; set; }
                public PaginationInput paginationInput = new PaginationInput();

            }
            public class PaginationInput
            {
                public string entriesPerPage { get; set; }
                public string pageNumber { get; set; }
            }
            public class itemFilters
            {
                public string name { get; set; }
                public string value { get; set; }
            }
        }

1 Ответ

0 голосов
/ 27 мая 2018

Это не правильный JSON.Он имеет SyntaxError: Дублирующий ключ 'outputSelector' в строке 9.

enter image description here

Если вы планируете использовать массив outputSelector, код необходимо изменить какниже, чтобы получить действительный JSON.Пример действительного JSON:

{
    "findCompletedItemsRequest": {
        "keywords": "searchtext",
        "itemFilter": [{
            "name": "SoldItemsOnly",
            "value": "true"
        }],
        "outputSelector": ["PictureURLLarge", "SellerInfo"],
        "paginationInput": {
            "entriesPerPage": "100",
            "pageNumber": "1"
        }
    }
}

Пример модификации кода C #:

namespace Solutions{
    using System.Collections.Generic;
    using Newtonsoft.Json;
    public class EBaySearchBody{
        public class FindCompletedItemsRequest{
            [JsonProperty("keywords", Order = 1)]
            public string Keywords { get; set; }

            [JsonProperty("itemFilter",Order = 2)]
            public List<ItemFilter> ItemFilters { get; set; }

            [JsonProperty("outputSelector", Order = 3)]
            public List<string> OutputSelectors { get; set; }

            [JsonProperty("paginationInput", Order = 4)]
            public PaginationInput PaginationInput { get; set; }
        }
        public class PaginationInput{
            [JsonProperty("entriesPerPage", Order = 1)]
            public string EntriesPerPage { get; set; }

            [JsonProperty("pageNumber", Order = 2)]
            public string PageNumber { get; set; }
        }
        public class ItemFilter{
            [JsonProperty("name", Order = 1)]
            public string Name { get; set; }

            [JsonProperty("value", Order = 2)]
            public string Value { get; set; }
        }
        [JsonProperty("findCompletedItemsRequest")]
        public FindCompletedItemsRequest FindCompletedItemsRequestObject { get; set; }

        /// <summary>
        /// Create a <see cref="EBaySearchBody"/>object and serialize it to a JSON stream
        /// </summary>
        /// <returns></returns>
        public static string WriteFromObject()
        {
            //Create EbaySearchBody object.  
            EBaySearchBody searchBody = new EBaySearchBody(){
                    FindCompletedItemsRequestObject = new FindCompletedItemsRequest(){
                        Keywords = "searchtext",
                        ItemFilters = new List<ItemFilter>(){
                            new ItemFilter {
                                Name = "SoldItemsOnly",
                                Value = "true"
                            }
                        },
                        OutputSelectors = new List<string>(){
                            "PictureURLLarge",
                            "SellerInfo"
                        },
                        PaginationInput = new PaginationInput(){
                            EntriesPerPage = "100",
                            PageNumber = "1"
                        }
                    }
                };
            return JsonConvert.SerializeObject(searchBody);
        }
    }
}
...