Reputation: 1547
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
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
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
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
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