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

时间:2017-04-13 18:37:23

标签: c# json json.net

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

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);

2 个答案:

答案 0 :(得分: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>();
    

答案 1 :(得分:2)

在我这方面,是因为我没有财产的公开传承人。 不用

"CompanyProject\Models\Model1.Context.tt.
Error message is The custom tool 'TextTemplatingFileGenerator' failed."
CompanyProject\Models\Model1.tt.
Error message is The custom tool 'TextTemplatingFileGenerator' failed.**

我应该有

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

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