Waqas Kanju
Waqas Kanju

Reputation: 94

json to c# deserilization

I want to convert this JSON return from php file into c#. But as a newbie don't know how, please help.

{"response": [
    {"user_id":"26","crtloc_lat":"47.678238","crtloc_lng":"-122.131416"},
    {"user_id":"27","crtloc_lat":"9.350192","crtloc_lng":"-95.391006"},
    {"user_id":"28","crtloc_lat":"47.678238","crtloc_lng":"-122.131416"}
]}

The above JSON is returned from my PHP file.

WebRequest request = WebRequest.Create("http://localhost/abh/returntest.php");
WebResponse response = await request.GetResponseAsync();
List<Response>  json ;
using (var stream = new StreamReader(response.GetResponseStream()))
{
    json = JsonConvert.DeserializeObject<List<Response>>(stream.ReadToEnd());
}
foreach (var item in json)
{
    Console.WriteLine("id={0},latitude={1},longitude={2}",item.user_id,item.crtloc_lat,item.crtloc_lng);
}            

The Classes I am using are:

public class Response
{
    public string user_id { get; set; }
    public string crtloc_lat { get; set; }
    public string crtloc_lng { get; set; }
}

public class RootObject
{
    public List<Response> response { get; set; }
}

I am getting this error:

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[afterall.Response]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

Upvotes: 1

Views: 95

Answers (3)

Dietz
Dietz

Reputation: 578

The following line is wrong based on your sample JSON.

json = JsonConvert.DeserializeObject<List<Response>>(stream.ReadToEnd());

Try changing it to:

json = JsonConvert.DeserializeObject<RootObject>(stream.ReadToEnd());

Edit:

WebRequest request = WebRequest.Create("http://localhost/abh/returntest.php");
WebResponse response = await request.GetResponseAsync();
RootObject json;
using (var stream = new StreamReader(response.GetResponseStream()))
{
    json = JsonConvert.DeserializeObject<RootObject>(stream.ReadToEnd());
}
foreach (var item in json)
{
    Console.WriteLine("id={0},latitude={1},longitude={2}",item.user_id,item.crtloc_lat,item.crtloc_lng);
}   

Upvotes: 3

Uwe Hafner
Uwe Hafner

Reputation: 4999

From your testlink in the comment of your post. Your response is not:

{"response": [
    {"user_id":"26","crtloc_lat":"47.678238","crtloc_lng":"-122.131416"},
    {"user_id":"27","crtloc_lat":"9.350192","crtloc_lng":"-95.391006"},
    {"user_id":"28","crtloc_lat":"47.678238","crtloc_lng":"-122.131416"}
]}

as you post but rather:

connected{"response": [
         {"user_id":"26","crtloc_lat":"47.678238","crtloc_lng":"-122.131416"},
          {"user_id":"27","crtloc_lat":"9.350192","crtloc_lng":"-95.391006"},
          {"user_id":"28","crtloc_lat":"47.678238","crtloc_lng":"-122.131416"
          }]
    }

This is not corresponding to your sample code. Remove the

connected{ }

wrapping or return correct json for a connected object (whatever the connect is). If you remove the wrapping it should work as @Dietz posted.

Upvotes: 0

Mainak
Mainak

Reputation: 470

rewrite the following line :

json = JsonConvert.DeserializeObject<List<Response>>(stream.ReadToEnd());

as

json = JsonConvert.DeserializeObject<Response>(stream.ReadToEnd());

Upvotes: 0

Related Questions