2017-04-13 18 views
1

私はシリアル化に以下のコードを使用しています。Json.netの逆シリアル化で空のオブジェクトが返されます

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

summaryタイプSplunkDataModelのカスタムオブジェクトである:以下JSONで

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

シリアライズ結果:

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

は今、ユニットテストの目的のために、私は、それをデシリアライズする必要があります以下のコードは空の値を持つオブジェクトを返しています。どこが間違っていますか?

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

答えて

1

あなたはJSONにごSplunkDataModelをシリアライズするときは、summaryプロパティを持つオブジェクトに包み。したがって、JSONを逆シリアル化してオブジェクトに戻すときは、同じ構造を使用する必要があります。それについてはいくつかの方法があります。彼らはすべて同じ結果を達成します。のインスタンスに、実施例によるデシリアライズを

var deserialized = JsonConvert.DeserializeObject<RootObject>(contents).Summary; 
  • または:そして

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

    1. JSONのルートレベルを表し、その中にデシリアライズするクラスを宣言匿名型の場合は、結果からオブジェクトを取得します。

      var anonExample = new { summary = new SplunkDataModel() }; 
      var deserialized = JsonConvert.DeserializeAnonymousType(contents, anonExample).summary; 
      
    2. それとも、jオブジェクトにデシリアライズし、そこから自分のオブジェクトを実体化:

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

    共有するためのおかげで..私は3番目の方法でそれをやりました。 – Manish

    関連する問題