【问题标题】:Parse JSON Array in asp.NET在 asp.NET 中解析 JSON 数组
【发布时间】:2013-10-30 09:11:33
【问题描述】:

我想使用 c# 在 asp.net 中解析这个 json 数组 这是要解析的示例 Json 数据:

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

这是我目前在我的代码文件中所做的:

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

我在这里做错了什么。它在visitlist = serializer.ReadObject(stream) as PiwikDbData[]; 处显示“根级别的数据无效” 非常感谢您的帮助。谢谢。

【问题讨论】:

标签: c# asp.net json


【解决方案1】:

您正在使用为 XML-Data 制作的 DataContractSerializer。
http://msdn.microsoft.com/de-de/library/system.runtime.serialization.datacontractserializer(v=vs.100).aspx

对于 JSON 数据,您应该使用 DataContractJsonSerializer:
http://msdn.microsoft.com/de-de/library/system.runtime.serialization.json.datacontractjsonserializer.aspx

您还尝试反序列化单个项目
new DataContractSerializer(typeof(PiwikDbData));
但您真正需要的是项目列表
new DataContractSerializer(typeof(PiwikDbData[]));


这就是我的代码的样子:

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

【讨论】:

    【解决方案2】:

    只需下载JSON.NET然后使用:

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

    这应该会返回一个 JArray 对象,它将是 List 类型。

    【讨论】:

      【解决方案3】:

      您尝试使用一个 item 元素解析 json 数组结果。

      我认为正确的行是:

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

      【讨论】:

        【解决方案4】:

        使用以下代码:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-04
          • 1970-01-01
          • 2015-05-14
          • 2017-05-15
          • 2017-01-23
          • 2012-04-21
          • 2018-03-08
          相关资源
          最近更新 更多