2016-11-09 26 views
-1

は、私はこのようないくつかのJSONを持っていると言います。どのように私はそれがこのにデシリアライズ確保することができます:Json.Netデシリアライズ逆参照

[{Prop1: true}, {SomeProp: true}] //[0] = id1, [1] = id3 

の代わりにこの:

[{Prop1: true}, null] //[0] = id1, [1] = null because it doesn't match on "$ref" down the hierarchy. 

編集を明確にするため:私は[0]このコード

public class StackOverflow 
    { 
     public bool Prop1 { get; set; } 
    } 
static void Main(string[] args) 
{ 
    string json = @"[{""$id"": ""1"", Prop1: true, Prop2: {""$id"": ""2"", Prop2: {""$id"": ""3"", Prop1: true}}}, {""$ref"" : ""3""}]"; 
    dynamic result = JsonConvert.DeserializeObject<List<StackOverflow>>(json); 

} 

結果を実行したときに来てどのように StackOverflowクラスです。 result [1]はnullです。どのようにしてそれを逆参照するのですか?私は何が欠けていますか?

+0

答えを探しますここに: http://stackoverflow.com/questions/23505381/json-tree-modifications-that-dont-break-ref-references – MaitlandMarshall

+0

JSONを手入力しましたか? Json.NETは '' $ ref ''と' '$ id" 'の値を整数ではなく文字列にする必要があるからです。 – dbc

+0

ええ、申し訳ありません、ただの疑似コードです。 – MaitlandMarshall

答えて

2

"ref"および"$id"プロパティは、参照追跡と保存が有効な場合にJson.NETによって挿入されます。ドキュメントについては、Preserving Object Referencesを参照してください。したがって、元のオブジェクトグラフを逆シリアル化するには、JsonSerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objectsの設定を使用する必要があります。

ただし、この設定を有効にしても、提案したデータモデルはJSONと一致しません。次のようにフォーマットされたJSONは:

[ 
    { 
    "$id": "1", 
    "Prop1": true, 
    "Prop2": { 
     "$id": "2", 
     "Prop2": { 
     "$id": "3", 
     "Prop1": true 
     } 
    } 
    }, 
    { 
    "$ref": "3" 
    } 
] 

あなたが見ることができるように、配列内の最初のエントリは、別の内部ネストされたオブジェクトと、ネストされたオブジェクトであり、一方が2つの特性を有します。配列の2番目のエントリは、最初のエントリからの最も内側のネストされたオブジェクトへの参照です。そのため、ネストされた参照のは、次のようなフラットList<StackOverflow>にデシリアライズすることはできません。

public class StackOverflow 
{ 
    public bool Prop1 { get; set; } 
} 

代わりに、あなたは次のような再帰的なモデ​​ルを定義する必要があります。

public class StackOverflow 
{ 
    public bool? Prop1 { get; set; } 
    public StackOverflow Prop2 { get; set; } 
} 

次に、あなたのデシリアライゼーションコードが見えますlike:

 string json = @"[{""$id"": ""1"", Prop1: true, Prop2: {""$id"": ""2"", Prop2: {""$id"": ""3"", Prop1: true}}}, {""$ref"" : ""3""}]"; 

     var settings = new JsonSerializerSettings 
     { 
      PreserveReferencesHandling = PreserveReferencesHandling.Objects, 
     }; 
     var result = JsonConvert.DeserializeObject<StackOverflow []>(json, settings); 

サンプルfiddle

、我々があれば再シリアライズとしてPreserveReferencesHandling.Objectsせず、次のとおりです。

 var settingsOut = new JsonSerializerSettings 
     { 
      Formatting = Formatting.Indented, 
      NullValueHandling = NullValueHandling.Ignore, 
     }; 
     var jsonWithoutRef = JsonConvert.SerializeObject(root, settingsOut); 

     Console.WriteLine("Re-serialized with PreserveReferencesHandling.None"); 
     Console.WriteLine(jsonWithoutRef); 

我々はStackOverflowの最も内側のインスタンスが正しく二番目の配列の位置に配置されていることを参照してください。

[ 
    { 
    "Prop1": true, 
    "Prop2": { 
     "Prop2": { 
     "Prop1": true 
     } 
    } 
    }, 
    { 
    "Prop1": true 
    } 
] 
関連する問題