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.

1

4 Answers 4

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);
Sign up to request clarification or add additional context in comments.

Comments

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.

Comments

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

Comments

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

Comments

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.