2017-11-08 19 views
0

を使用して再帰的にクラス階層をデシリアライズすることはできません。カスタムJsonConverterを使用してJSON文字列から逆シリアル化する必要があります。問題は、特定のケースごとにコードがありますが、ルールプロパティを処理するために再帰的に実行することはできません。各要素も条件になります。 私のコードは、この(ReadJson法)のようになります。は、私はこのようなクラス階層を持ってJSON.NET

var jo = JObject.Load(reader); 
Rule rule = null; 

if (jo["condition"] == null) 
{ 
    rule = new Rule(); 
    //fill the properties for rule 
} 
else 
{ 
    rule = new Condition(); 
    //I now want the converter to go through all the values in jo["rules"] and turn them into Rules or Conditions 
} 

これを達成するための最良の方法は何ですか?オブジェクトが条件であることが判明した場合、私は、残りの部分のためのJSONを取得しようとしました:

var rules = JsonConvert.DeserializeObject<Rule[]>(json, this); 

例外:

var json = jo.GetValue("rule").ToString(); 

しかし、私はこのようにそれをデシリアライズすることはできません、それは例外がスローされますis:JsonReaderException:JsonReaderからJObjectを読み込む際にエラーが発生しました。現在のJsonReaderアイテムはオブジェクトではありません:StartArray。パス "、1行目、1位。

アイデア?

+0

JSONが好きなものを見ていますか? –

+0

もちろん、ルールや条件の配列と同様です。 [{...}、{"condition":true、...}]のようなものです。 –

答えて

1

あなたはそれを働かせるほど遠くないです。 JSONのconditionプロパティの有無に基づいて正しいタイプのオブジェクトをインスタンス化した後、serializer.Populateメソッドを使用してインスタンスを設定できます。これは再帰を自動的に処理する必要があります。新しいJsonReaderインスタンスをPopulateに渡す必要があります。これはjo.CreateReader()を使用して作成できます。ここで

は、コンバータがどのように見えるかです:ここでは

public class RuleConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return typeof(Rule).IsAssignableFrom(objectType); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var jo = JObject.Load(reader); 
     Rule rule = null; 

     if (jo["condition"] == null) 
     { 
      rule = new Rule(); 
     } 
     else 
     { 
      rule = new Condition(); 
     } 

     serializer.Populate(jo.CreateReader(), rule); 
     return rule; 
    } 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

実施例である:https://dotnetfiddle.net/SHctMo

+0

ありがとうございますが、私はserializer.Populateを呼び出すとまだこの例外が発生しています:JsonReaderException:JsonReaderからJObjectを読み込む際にエラーが発生しました。現在のJsonReaderアイテムはオブジェクトではありません:StartArray。パス 'ルール'、1行目、31桁目。 私のコードはあなたのコードと同じです。 –

+0

あなたのJSONは、私が掲示した例のものと同じ構造をしていますか、それとも何とか違うのですか?私が働いているものを見ることができなくても、問題が何であるかを診断するのは難しいです。問題を示す[mcve]を作成できますか? (これを行う最も簡単な方法は、私の例のフィドルをフォークし、JSONを変更することです) –

+0

これは今、多くのおかげで働いています!私の間違いは、それは通常です! :-) –

関連する問題