【问题标题】:JSON.NET Deserialization in C# results in empty objectC# 中的 JSON.NET 反序列化导致空对象
【发布时间】:2010-06-04 16:55:39
【问题描述】:

我正在尝试使用 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)。你能帮我找出问题所在吗?

【问题讨论】:

    标签: c# json.net


    【解决方案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 库的其他属性/标志来更改此行为,但我不太了解。

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 2012-06-20
      相关资源
      最近更新 更多