JSON.NET C#中的反序列化导致空对象

Alt*_*oru 6 c# json.net

我正在尝试使用JSON.NET反序列化来填充C#对象(ImportedProductCodesContainer)和数据.

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};
}
Run Code Online (Sandbox Code Playgroud)

JSON字符串:

{"ImportedProductCodesContainer":{"ProductListRaw":"1 23","Action":"Append"}}
Run Code Online (Sandbox Code Playgroud)

C#代码:

 var serializer = new JsonSerializer();
 var importedProductCodesContainer = 
     JsonConvert.DeserializeObject<ImportedProductCodesContainer>(argument);
Run Code Online (Sandbox Code Playgroud)

的问题是,importedProductCodesContainer保持运行上面的代码后空的(动作= 0,ProductListRaw = NULL).你能帮我弄清楚出了什么问题吗?

Rup*_*Rup 1

你的 级别太多了ImportedProductCodesContainer。它正在创建一个新ImportedProductCodesContainer对象(从模板化反序列化器),然后尝试在其上设置一个名为ImportedProductCodesContainer(从 JSON 顶层)的属性,该属性将是包含其他两个值的结构。如果您仅反序列化内部部分

{"ProductListRaw":"1 23","Action":"Append"}
Run Code Online (Sandbox Code Playgroud)

那么您应该获得您期望的对象,或者您可以使用 ImportedProductCodesContainer 属性创建一个新结构

[JsonObject(MemberSerialization.OptOut)]
public class ImportedProductCodesContainerWrapper
{
    [JsonProperty]
    public ImportedProductCodesContainer ImportedProductCodesContainer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并用它来模板化你的反序列化器,然后你的原始 JSON 应该可以工作。

也可以使用该 JSON 库的其他属性/标志来更改此行为,但我不太了解它。