8

I have following JSON string:

[
  { "Person" : { "Name" : "John", "Gender" : "male" } },
  { "Person" : { "Name" : "John", "Gender" : "male" } }
]

(As you may notice unfortunately I have a sort of "root" element for each object in the array. Without this "root" element the task becomes quite trivial.)

I have to deserialize it into a list of Person class:

class Person {
    public string Name { get; set; }
    public string Gender { get; set; }
}
...
List<Person> ListPersons() {
    return JsonConvert.DeserializeObject<List<Person>>(jsonString);
}

Is it possible to do with Json.NET without creating wrapper class like PersonResult?

class PersonResult {
    public Person Person { get; set; }
}
...
List<Person> ListPersons() {
    return JsonConvert.DeserializeObject<List<PersonResult>>(jsonString)
                      .Select(p => p.Person)
                      .ToList();
}

The perfect solution for me is to be able somehow explicitly specify this "root" (e.g. via attribute) and do not create any wrappers, helpers, etc.

2 Answers 2

6

Unfortunatelly, there's not much you can do about this issue. That's how JSON format looks like and there's no way around that. As a result, Json.Net "sees" your string as more or less:

an array of objects with Person property, which is another object with Name and Gender properties

You could possibly play some with custom ContractResolvers to force serializer to work differently... but that's quite a bit of work. Wrapper class like you suggested is how those problems are dealt with, and I suggest sticking to it.

Sign up to request clarification or add additional context in comments.

1 Comment

Yeah, unfortunately I had to end up with wrapper approach. Thanks.
0
class PersonResult : List<Person> {}

class Person 
{
    public string Name { get; set; }
    public string Gender { get; set; }
}

main() {
    return JsonConvert.DeserializeObject<PersonResult>(jsonString);
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.