【问题标题】:How do I deserialize this JSON array (C#)如何反序列化此 JSON 数组(C#)
【发布时间】:2015-07-28 16:14:50
【问题描述】:

我正在为一个有很多变体的主题而苦苦挣扎,但我似乎找不到适合我的主题,我认为这是因为我的 JSON 数组的方式。 我不是 C# 或 JSON 方面的专家,但我已经设法“几乎”让它工作。我需要掌握 JSON 将反序列化到的类。

当我运行代码时,我没有收到错误,只是 xKisokData var 中有一个空值。

我得到的 JSON 数据。他们是这两个不同的。

"{\"Event\": \"sConnection\",\"data[device]\": \"fb16f550-2ef1-11e5-afe9-ff37129acbf4\",\"data[mode]\": \"customer\",\"data[starttime]\": \"2015-07-22T16:07:42.030Z\",\"data[endtime]\": \"\"}"
"{\"Event\": \"Log\",\"data[id]\": \"2015-07-22T16:07:23.063Z\",\"data[messages][0][source]\": \"server\",\"data[messages][0][message]\": \"Server is listening on port 1553\"}"

我目前的代码:

// Read in our Stream into a string...
StreamReader reader = new StreamReader(JSONdataStream);
string JSONdata = reader.ReadToEnd();

JavaScriptSerializer jss = new JavaScriptSerializer();
wsKisokData[] xKisokData = jss.Deserialize<wsKisokData[]>(JSONdata);

我的班级:

namespace JSONWebService
{

    [DataContract]
    [Serializable]
    public class KisokEvent
    {
        public string eventTrigger { get; set; }
    }

    [DataContract]
    [Serializable]
    public class KisokData
    {
        public string data { get; set; }

    }

    [DataContract]
    [Serializable]
    public class wsKisokData
    {
        public KisokEvent KDEvent { get; set; }
        public List<KisokData> KDData { get; set; }

    }

}

我确定我不了解反序列化过程。感谢您的帮助。

编辑: 我把 JSON 放在调试器的右上方,这里是字符串。

{
    "Event": "sConnection",
    "data[device]": "fb16f550-2ef1-11e5-afe9-ff37129acbf4",
    "data[mode]": "customer",
    "data[starttime]": "2015-07-22T16:07:42.030Z",
    "data[endtime]": ""
}

{
    "Event": "Log",
    "data[id]": "2015-07-22T16:07:23.063Z",
    "data[messages][0][source]": "server",
    "data[messages][0][message]": "Server is listening on port 1553"
}

【问题讨论】:

  • “JSON”示例中的所有引用是因为您从 VS 调试器复制它们吗?
  • 一种可能性是您的 JSON 对象中的属性似乎是 EventData。您对象的属性是KDEventKDData。如果更改 .NET 对象的属性以匹配会发生什么?
  • 这可能会回答你的问题:stackoverflow.com/questions/15253633/…
  • 很好的句柄@dustmouse,但是那个没有工作,因为当你定义类时,“data[id]”c#抱怨你正在尝试创建一个数组。还是谢谢你。
  • 您展示的两个 JSON 示例是对象(外部分隔符为 {})而不是数组(外部分隔符为 [])。为什么要反序列化为数组?

标签: c# json json.net json-deserialization


【解决方案1】:

我强烈建议改用 nuget 的 json.net 包。 您可以通过将json粘贴到http://json2csharp.com/中来为其生成模板类(模型)

然后使用所述模型通过执行以下操作将 json 转换为 c# 对象(反序列化)

var jsonStructure = JsonConvert.DeserializeObject<model>(json)

并像只是一个标准对象一样查询

foreach (var x in jsonStructure.KDData)
{
    doAction(x.data);
}
// for example

【讨论】:

  • Kaelan Fouwels - 我使用了上面的 json 字符串,而不是引号中的字符串,并且 json2CSparp 返回了错误,__invalid_name__data[...]_Nope 不起作用,但感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2017-10-16
  • 2012-09-20
相关资源
最近更新 更多