I have a piece of JSON that looks like this:
[
{
"$id": "1",
"Name": "James",
"BirthDate": "1983-03-08T00:00Z",
"LastModified": "2012-03-21T05:40Z"
},
{
"$ref": "1"
}
]
As you can tell by the $ref, this JSON array contains the same Person (James), twice. The second time is a reference to the first.
I am wondering if there is a way to deserialize this JSON into an object that contains two copies of the James person.
Currently, I'm using this:
var jsonSerializerSettings = new JsonSerializerSettings()
{
PreserveReferencesHandling = PreserveReferencesHandling.None,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
var deserializedPersons = JsonConvert.DeserializeObject<List<Person>>(json, jsonSerializerSettings);
But this just gives me an array with the same instance of the Person, twice:
object.ReferenceEquals(deserializedPersons[0], deserializedPersons[1]) // Evaluates to true
I've found a workaround I am unhappy with which is simply deserializing the JSON string, then serializing it using the jsonSerializerSettings above, which will duplicate the person in the JSON, then deserializing it again. This is causing major slowdowns for the large objects we are using.
Note: I know I could change the API that I retrieve this JSON from to duplicate the data, but preserving the references saves substantial space when sending the response JSON over the wire.
See Question&Answers more detail:os