Json.net反序列化返回一个空对象

Man*_*ish 2 c# json json.net

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

var json = JsonConvert.SerializeObject(new { summary = summary });
Run Code Online (Sandbox Code Playgroud)

summary是类型的自定义对象SplunkDataModel

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

序列化产生以下JSON:

{
  "summary": {
    "Category": "category",
    "JobStatus": "Failure",
    "JobInfo": {
      "Course processing failed": "" 
    },
    "TotalCount": 0,
    "SuccessCount": 0,
    "FailureCount": 0,
    "FailureEntity": {},
    "SuccessEntity": []
  }
}
Run Code Online (Sandbox Code Playgroud)

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

var deserialized = JsonConvert.DeserializeObject<SplunkDataModel>(contents);
Run Code Online (Sandbox Code Playgroud)

Bri*_*ers 9

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

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

    public class RootObject
    {
        public SplunkDataModel Summary { get; set; }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    然后:

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

    var anonExample = new { summary = new SplunkDataModel() };
    var deserialized = JsonConvert.DeserializeAnonymousType(contents, anonExample).summary;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 或者,反序列化为 JObject,然后从中具体化您的对象:

    JObject obj = JObject.Parse(contents);
    var deserialized = obj["summary"].ToObject<SplunkDataModel>();
    
    Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 5

在我这方面,是因为我没有财产的公开拍卖。而不是

public class MyClass
{        
    public int FileId { get; }
}
Run Code Online (Sandbox Code Playgroud)

我应该

public class MyClass
{        
    public int FileId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 啊啊啊!我的天啊!谢谢! (4认同)
  • 就我而言,有内部公共字符串 Currency { get; 内部设置;} (2认同)
  • @HamitYILDIRIM Aaargh...我拉了一半的头发,直到我读到你的评论,非常感谢! (2认同)
  • 我遇到了同样的问题,@HamitYILDIRIM DeserializeAsync 不会使用 `{ get; 映射 JSON 属性;内部设置;我用“[JsonIninclude]”属性装饰了属性,一切都按预期工作。 (2认同)