Shoaib Shakeel
Shoaib Shakeel

Reputation: 1547

Parse JSON Array in asp.NET

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.

Upvotes: 0

Views: 9976

Answers (4)

tveng
tveng

Reputation: 200

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);

Upvotes: 3

Nitin Joshi
Nitin Joshi

Reputation: 1668

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);

Upvotes: 0

tranceporter
tranceporter

Reputation: 2261

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.

Upvotes: 3

tdelepine
tdelepine

Reputation: 2016

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);
}
...

Upvotes: 0

Related Questions