0

I want to parse this json array in asp.net using c# This is a sample Json data to parse:

[
    {
        "idvisit":"3",
        "iduser":"shoaibshakeel",
        "idpage":"1",
        "pagetime":"0"
    },
    {
        "idvisit":"4",
        "iduser":"shoaibshakeel",
        "idpage":"2",
        "pagetime":"28"
    },
    {
        "idvisit":"5",
        "iduser":"shoaibshakeel",
        "idpage":"3",
        "pagetime":"0"
    }
]

This is i am currently doing in my code file:

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Text;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string jsonData = Request.Form[0];
        Response.Write(jsonData);
        Response.Write("<br/>");
        PiwikDbData[] visitlist;

        //deserialize json array
        using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonData)))
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(PiwikDbData));

            visitlist = serializer.ReadObject(stream) as PiwikDbData[];
        }

        Response.Write(visitlist.Length);
    }

}

[DataContract]
class PiwikDbData
{
    [DataMember(Name = "idvisit", IsRequired = true)]
    public int idvisit;

    [DataMember(Name = "iduser", IsRequired = true)]
    public string iduser;

    [DataMember(Name = "idpage", IsRequired = true)]
    public int idpage;

    [DataMember(Name = "pagetime", IsRequired = true)]
    public int pageTime;
}

What am i doing wrongs here. It is showing 'The data at the root level is invalid' at visitlist = serializer.ReadObject(stream) as PiwikDbData[]; help will by much appreciated. Thanks.

Shoaib Shakeel
  • 1,447
  • 18
  • 24
  • this may help: http://stackoverflow.com/questions/6935343/deserialize-json-arrayor-list-in-c-sharp – Zaki Oct 30 '13 at 09:13

4 Answers4

3

You are using the DataContractSerializer that is made for XML-Data.
http://msdn.microsoft.com/de-de/library/system.runtime.serialization.datacontractserializer(v=vs.100).aspx

For JSON-Data you should use the DataContractJsonSerializer:
http://msdn.microsoft.com/de-de/library/system.runtime.serialization.json.datacontractjsonserializer.aspx

Also you try to deserialize a single item
new DataContractSerializer(typeof(PiwikDbData));
But what you really need is a list of items
new DataContractSerializer(typeof(PiwikDbData[]));


Thats how my code looks like:

string jsonData = Request.Form[0];
Response.Write(jsonData);
Response.Write("<br/>");
PiwikDbData[] visitlist;

//deserialize json array
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonData)))
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(PiwikDbData[]));
    visitlist = (PiwikDbData[])serializer.ReadObject(stream);
}

Response.Write(visitlist.Length);
tveng
  • 200
  • 2
  • 9
3

Just download JSON.NET and then use:

var wikiData = JsonConvert.DeserializeObject<List<PiwikDbData>>(jsonData);

This should return you a JArray object which will be List type.

tranceporter
  • 2,241
  • 1
  • 21
  • 23
0

You try parse an json array result with one item element.

I think the correct lines is :

...
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonData)))
{
   DataContractSerializer serializer = new DataContractSerializer(typeof(List<PiwikDbData>));

   List<PiwikDbData>visitlist = serializer.ReadObject(stream);
}
...
tdelepine
  • 1,986
  • 1
  • 13
  • 19
0

Use following code:

    //deserialize json array
    using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonData)))
    {
        var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(PiwikDbData[]));

        visitlist = serializer.ReadObject(stream) as PiwikDbData[];
    }

    Response.Write(visitlist.Length);
Nitin Joshi
  • 1,638
  • 1
  • 14
  • 17