Click or drag to resize
Json.NET

PreserveReferencesHandling setting

 

This sample shows how the PreserveReferencesHandling setting can be used to serialize values by reference instead of by value.

Sample
Types
public class Directory
{
    public string Name { get; set; }
    public Directory Parent { get; set; }
    public IList<File> Files { get; set; }
}

public class File
{
    public string Name { get; set; }
    public Directory Parent { get; set; }
}
Usage
Directory root = new Directory { Name = "Root" };
Directory documents = new Directory { Name = "My Documents", Parent = root };

File file = new File { Name = "ImportantLegalDocument.docx", Parent = documents };

documents.Files = new List<File> { file };

try
{
    JsonConvert.SerializeObject(documents, Formatting.Indented);
}
catch (JsonSerializationException)
{
    // Self referencing loop detected for property 'Parent' with type
    // 'Newtonsoft.Json.Tests.Documentation.Examples.ReferenceLoopHandlingObject+Directory'. Path 'Files[0]'.
}

string preserveReferenacesAll = JsonConvert.SerializeObject(documents, Formatting.Indented, new JsonSerializerSettings
{
    PreserveReferencesHandling = PreserveReferencesHandling.All
});

Console.WriteLine(preserveReferenacesAll);
// {
//   "$id": "1",
//   "Name": "My Documents",
//   "Parent": {
//     "$id": "2",
//     "Name": "Root",
//     "Parent": null,
//     "Files": null
//   },
//   "Files": {
//     "$id": "3",
//     "$values": [
//       {
//         "$id": "4",
//         "Name": "ImportantLegalDocument.docx",
//         "Parent": {
//           "$ref": "1"
//         }
//       }
//     ]
//   }
// }

string preserveReferenacesObjects = JsonConvert.SerializeObject(documents, Formatting.Indented, new JsonSerializerSettings
{
    PreserveReferencesHandling = PreserveReferencesHandling.Objects
});

Console.WriteLine(preserveReferenacesObjects);
// {
//   "$id": "1",
//   "Name": "My Documents",
//   "Parent": {
//     "$id": "2",
//     "Name": "Root",
//     "Parent": null,
//     "Files": null
//   },
//   "Files": [
//     {
//       "$id": "3",
//       "Name": "ImportantLegalDocument.docx",
//       "Parent": {
//         "$ref": "1"
//       }
//     }
//   ]
// }