【问题标题】:Json.net deserialization is returning an empty objectJson.net 反序列化返回一个空对象
【发布时间】:2017-04-13 18:37:23
【问题描述】:

我正在使用下面的代码进行序列化。

var json = JsonConvert.SerializeObject(new { summary = summary });

summarySplunkDataModel 类型的自定义对象:

public class SplunkDataModel
{
    public SplunkDataModel() {}

    public string Category { get; set; }
    public int FailureCount { get; set; }
    public Dictionary<string, SplunkError> FailureEntity { get; set; }
    public Dictionary<string, string> JobInfo { get; set; }
    public string JobStatus { get; set; }
    public int SuccessCount { get; set; }
    public List<string> SuccessEntity { get; set; }
    public int TotalCount { get; set; }
}

序列化后的 JSON 如下:

{
  "summary": {
    "Category": "category",
    "JobStatus": "Failure",
    "JobInfo": {
      "Course processing failed": "" 
    },
    "TotalCount": 0,
    "SuccessCount": 0,
    "FailureCount": 0,
    "FailureEntity": {},
    "SuccessEntity": []
  }
}

现在,出于单元测试的目的,我需要对其进行反序列化,但下面的代码将返回一个具有空值的对象。我哪里错了?

var deserialized = JsonConvert.DeserializeObject<SplunkDataModel>(contents);

【问题讨论】:

    标签: c# json json.net


    【解决方案1】:

    就我而言,这是因为我的属性没有public setter。 而不是拥有

    public class MyClass
    {        
        public int FileId { get; }
    }
    

    我应该有

    public class MyClass
    {        
        public int FileId { get; set; }
    }
    

    愚蠢的错误,花了我几个小时......

    【讨论】:

    • AKHHHH!我的天啊!谢谢!
    • 就我而言,有内部公共字符串 Currency { get;内部集; }
    • @HamitYILDIRIM Aaargh...我拉了一半头发,直到我看到你的评论,非常感谢!
    • 我不知道你的代码,但应该有一个问题让你的代码范围感兴趣。异步函数必须知道函数调用已完成并准备反序列化。例如,您可以在箭头函数中使用它@PhilNicholas
    • 我遇到了与@HamitYILDIRIM DeserializeAsync 无法使用{ get; internal set; } 映射JSON 属性相同的问题我用[JsonInclude] 属性装饰了属性,一切都按预期工作。
    【解决方案2】:

    当您将SplunkDataModel 序列化为 JSON 时,您将其包装在具有 summary 属性的对象中。因此,当您将 JSON 反序列化回对象时,您需要使用相同的结构。有几种方法可以解决它;他们都达到了相同的结果。

    1. 声明一个类来表示 JSON 的根级别并反序列化为:

      public class RootObject
      {
          public SplunkDataModel Summary { get; set; }
      }
      

      然后:

      var deserialized = JsonConvert.DeserializeObject<RootObject>(contents).Summary;
      
    2. 或者,通过示例反序列化为匿名类型的实例,然后从结果中检索您的对象:

      var anonExample = new { summary = new SplunkDataModel() };
      var deserialized = JsonConvert.DeserializeAnonymousType(contents, anonExample).summary;
      
    3. 或者,反序列化为 JObject,然后从中实现您的对象:

      JObject obj = JObject.Parse(contents);
      var deserialized = obj["summary"].ToObject<SplunkDataModel>();
      

    【讨论】:

      猜你喜欢
      • 2015-11-11
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多