Десериализация JSON.NET в C# приводит к пустому объекту

Я пытаюсь заполнить объект C# (ImportedProductCodesContainer) с данными с помощью десериализации JSON.NET.

ImportedProductCodesContainer.cs:

using Newtonsoft.Json;

[JsonObject(MemberSerialization.OptOut)]
public class ImportedProductCodesContainer
{
    public ImportedProductCodesContainer()
    {

    }

    [JsonProperty]
    public ActionType Action { get; set; }

    [JsonProperty]
    public string ProductListRaw { get; set; }


    public enum ActionType {Append=1, Replace};
}

Строка JSON:

{"ImportedProductCodesContainer":{"ProductListRaw":"1 23","Action":"Append"}}

Код C#:

 var serializer = new JsonSerializer();
 var importedProductCodesContainer = 
     JsonConvert.DeserializeObject<ImportedProductCodesContainer>(argument);

Проблема состоит в том, что importedProductCodesContainer остается пустым после выполнения кода выше (Действие = 0, ProductListRaw = пустой указатель). Можно ли помочь мне выяснить что случилось?

6
задан skaffman 4 June 2010 в 08:55
поделиться

1 ответ

У вас слишком много уровней ImportedProductCodesContainer . Он создает новый объект ImportedProductCodesContainer (из шаблонного десериализатора), а затем пытается установить для него свойство под названием ImportedProductCodesContainer (из верхнего уровня вашего JSON), которое будет структурой, содержащей два других значения. Если вы десериализуете только внутреннюю часть

{"ProductListRaw":"1 23","Action":"Append"}

, тогда вы должны получить объект, который ожидаете, или вы можете создать новую структуру со свойством ImportedProductCodesContainer

[JsonObject(MemberSerialization.OptOut)]
public class ImportedProductCodesContainerWrapper
{
    [JsonProperty]
    public ImportedProductCodesContainer ImportedProductCodesContainer { get; set; }
}

и шаблон вашего десериализатора с этим, тогда ваш исходный JSON должен работать.

Также можно изменить это поведение, используя другие атрибуты / флаги с этой библиотекой JSON, но я не знаю этого достаточно хорошо, чтобы сказать.

1
ответ дан 17 December 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: