"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
}
]
答えを探しますここに: http://stackoverflow.com/questions/23505381/json-tree-modifications-that-dont-break-ref-references – MaitlandMarshall
JSONを手入力しましたか? Json.NETは '' $ ref ''と' '$ id" 'の値を整数ではなく文字列にする必要があるからです。 – dbc
ええ、申し訳ありません、ただの疑似コードです。 – MaitlandMarshall