6

我正在尝试使用 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};
}

JSON字符串:

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

C#代码:

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

问题是运行上述代码后, importedProductCodesContainer仍然为空(Action = 0,ProductListRaw = null)。你能帮我找出问题所在吗?

4

1 回答 1

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 库的其他属性/标志来更改此行为,但我不太了解它可以说。

于 2010-06-04T08:45:34.160 回答