6

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.

Carrie
  • 480
  • 3
  • 10
  • 25
  • 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. – Maximilian Gerhardt May 19 '16 at 22:31
  • 1
    Possible duplicate of [Deserialize partial JSON](http://stackoverflow.com/questions/22410511/deserialize-partial-json) – Evan Trimboli May 19 '16 at 22:41
  • Also see: http://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm – Evan Trimboli May 19 '16 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? – dbc May 19 '16 at 22:51

2 Answers2

14

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[]>();
Thomas Levesque
  • 286,951
  • 70
  • 623
  • 758
5

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.

Bogdan Beda
  • 758
  • 5
  • 12
  • this works, but it makes me having 3 classes which is not so cool. I'll upvote your answer. Thanks! – Carrie May 20 '16 at 18:22
  • I thought that was the direction you wanted to take, given your existing code. Use what's best for your scenario. Thanks! – Bogdan Beda May 22 '16 at 21:35