8

I have a json string like this:

{  
"Results":[  
  {  
   "attr1": "value1",
   "attr2": "value2",
   "A": "value_a",
   "B": "value_b",
   "C": "value_c", 
   "GuestValues":[  
        {  
            "A": "value_a",
            "B": "value_b",
            "C": "value_c"
        },
        {  
            "A": "value_a",
            "B": "value_b",
            "C": "value_c"
        },
        {  
            "A": "value_a",
            "B": "value_b",
            "C": "value_c"
        }
}
],
"TotalResults":1,
"MilliSeconds":11
}

I want to deserialize only the GuestValues array. I created a class like this:

public class GuestValue
{
    public string A;
    public string B;
    public string C;
}

public class GuestValueResult
{
    public List<GuestValue> GuestValues { get; set; }
    public in TotalResults { get; set; }
}

And call it like this:

GuestValueResult guestValues = JsonConvert.DeserializeObject<GuestValueResult>(jsongString);

But it doesn't work. I tried a lot, once somehow, it only gives me back the first "A", "B", "C" in the jsonString, the one above the "GuestValues", I don't want that group of data. I only want those inside "GuestValues". Please help.

4
  • What exact JSON string do you pass in? It would be easier to write the JSON class for the complete JSON string, I don't think the deserializer is nice enough to check what part of the string it can serialize and give that back to you. Commented May 19, 2016 at 22:31
  • 1
    Possible duplicate of Deserialize partial JSON Commented May 19, 2016 at 22:41
  • Also see: newtonsoft.com/json/help/html/SerializingJSONFragments.htm Commented May 19, 2016 at 22:42
  • 1
    Your JSON is invalid. You're missing a ] before the ending } ], "TotalResults":1, "MilliSeconds":11 }. I assume this is a typo? Commented May 19, 2016 at 22:51

2 Answers 2

18

You can use Linq to JSON (part of JSON.NET) to access the relevant node, then deserialize it:

var root = JObject.Parse(jsonString);
var guestValues = root["Results"][0]["GuestValues"].ToObject<GuestValue[]>();
Sign up to request clarification or add additional context in comments.

3 Comments

Actually it should be ToObject<List<GuestValue>> shouldn't it? (As opposed to GuestValueResult)
@BrianRogers, ah, yes, I got them mixed up... thanks
Ah, yes, I missed the array in the JSON... fixed
6

I don't know how the code you posted returns any useful value at all given that you have an Results array which is not mapped.

You need to create another class like this

 public class ResultsResult
 {
    public GuestValueResult[] Results { get; set; }
 }

And then deserialize using the class

 ResultsResult guestValues = JsonConvert.DeserializeObject<ResultsResult>(jsongString);

You'll then get what you expect.

2 Comments

this works, but it makes me having 3 classes which is not so cool. I'll upvote your answer. Thanks!
I thought that was the direction you wanted to take, given your existing code. Use what's best for your scenario. Thanks!

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.