JSON.NET Конфликт имени свойства при использовании JsonPropertyAttribute

1

У меня есть следующая строка JSON:

{
    "items" : "1",
    "itemdetails": 
    [
        {
            "id" : "5",
            "name:" "something"
        }
    ]
}

items представляют количество элементов, а фактические элементы - в itemdetails.

Я хотел бы десериализовать это на класс следующим образом:

class Parent
{
    JsonProperty("itemdetails")]
    public IEnumerable<Item> Items { get; set; }
}

class Item
{
    [JsonProperty("id")]
    public long Id { get; set; }

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

Однако, когда я звоню

JsonConvert.DeserializeObject<Parent>(inputString)

Я получаю JsonSerializationException что строка "1" не может быть преобразована в IEnumerable<Item>. Я думаю, парсер пытается десериализовать items из JSON в свойство Items потому что они совпадают по имени. И он игнорирует атрибут JsonProperty.

Это по дизайну? Любые обходные пути? Благодарю!

РЕДАКТИРОВАТЬ

Как заметил Брайан Роджерс, этот код работает правильно. Я подумал, что я пропустил, чтобы добавить кусочек головоломки.

Проблема в том, что я хочу использовать частные сборщики и инициализировать эти свойства из конструктора.

public Parent(IEnumerable<Item> items)
{
    this.Items = items;
}

Это вызывает исключение исключения. Что мне здесь делать? Аннотировать аргументы конструктора каким-то образом? Или используйте ConstructorHandling.AllowNonPublicDefaultConstructor?

  • 0
    Я удалил свой ответ, так как вы указали причину в вопросе. дать парсеру место для хранения предметов.
  • 0
    @Johannes: мне не нужно это свойство, я хотел бы пропустить его при разборе. Другого пути нет?
Показать ещё 1 комментарий
Теги:
deserialization
json.net

1 ответ

0
Лучший ответ

Я вижу два вопроса. Во-первых, ваш JsonProperty атрибут JsonProperty.

У тебя есть:

JsonProperty("itemdetails"]

Должен быть:

[JsonProperty("itemdetails")]

Во-вторых, часть вашего JSON недействительна.

У вас есть следующее:

 "name:" "something",

Должен быть:

 "name" : "something"

Исправив обе эти проблемы, я работал отлично. Вот тестовая программа, которую я использовал:

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""items"" : ""1"",
            ""itemdetails"": 
            [
                {
                    ""id"" : ""5"",
                    ""name"" : ""something""
                }
            ]
        }";

        Parent parent = JsonConvert.DeserializeObject<Parent>(json);
        foreach (Item item in parent.Items)
        {
            Console.WriteLine(item.Name + " (" + item.Id + ")");
        }
    }
}

class Parent
{
    [JsonProperty("itemdetails")]
    public IEnumerable<Item> Items { get; set; }
}

class Item
{
    [JsonProperty("id")]
    public long Id { get; set; }

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

Вывод:

something (5)

РЕДАКТИРОВАТЬ

Хорошо, поэтому, если я правильно вас понимаю, ваш настоящий класс Parent выглядит так:

class Parent
{
    public Parent(IEnumerable<Item> items)
    {
        this.Items = items;
    }

    [JsonProperty("itemdetails")]
    public IEnumerable<Item> Items { get; private set; }
}

В этом случае у вас есть несколько вариантов, чтобы заставить его работать:

Вы можете изменить имя параметра в своем конструкторе в соответствии с JSON, например:

    public Parent(IEnumerable<Item> itemdetails)
    {
        this.Items = itemdetails;
    }

ИЛИ вы можете добавить отдельный частный конструктор для использования Json.Net:

class Parent
{
    public Parent(IEnumerable<Item> items)
    {
        this.Items = items;
    }

    [JsonConstructor]
    private Parent()
    {
    }

    [JsonProperty("itemdetails")]
    public IEnumerable<Item> Items { get; private set; }
}
  • 0
    Я набирал пример из головы прямо в браузере, поэтому у меня есть опечатки. Я исправлю их.
  • 0
    Факт остается фактом: он работает, если ваши атрибуты верны (а JSON верен). Поэтому я бы проверил ваш код, чтобы убедиться, что вы не произвели опечатку в JsonProperty в JsonProperty «Items».
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню