【问题标题】:Deserializing JSON Object Array with Json.net classes [duplicate]使用 Json.net 类反序列化 JSON 对象数组 [重复]
【发布时间】:2015-12-05 22:11:08
【问题描述】:

我正在尝试使用 API 来获取报告,但我无法使用 JSON.NET 将 JSON 结果转换为可用信息。我查看了很多示例,但这些类的正确类格式让我难以理解。

JSON 数据:

{
    "status": "OK",
    "data": {
        "event": {
            "Time": "2015-09-01 17:31:47",
            "Username": "user1",
            "IP_Address": "1.2.3.4",
            "Action": "action1",
            "Data": "somedata"
        },
        "event": {
            "Time": "2015-09-01 17:30:30",
            "Username": "user2",
            "IP_Address": "1.2.3.5",
            "Action": "action2",
            "Data": "data"
        }
    }
}

我现在在哪里:

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;

public class aRoot
{
  [JsonProperty("status")]
  public string status { get; set; }
  [JsonProperty("data")]
  public aData data { get; set; }
}

public class aData
{
  [JsonProperty("event")]
  public List<aEvents> events { get; set; }
}

public class aEvents
{
  [JsonProperty("Time")]
  public DateTime time { get; set; }
  [JsonProperty("UserName")]
  public string user { get; set; }
  [JsonProperty("IP_Address")]
  public string ip { get; set; }
  [JsonProperty("Action")]
  public string action { get; set; }
  [JsonProperty("Data")]
  public string data { get; set; }
}
aRoot objReporting = JsonConvert.DeserializeObject<aRoot>(result);

有人有什么想法吗?

编辑:错误输出:

Newtonsoft.Json.dll 中出现“Newtonsoft.Json.JsonSerializationException”类型的异常,但未在用户代码中处理

附加信息:无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[aEvents]',因为该类型需要 JSON 数组(例如 [ 1,2,3]) 正确反序列化。

要修复此错误,要么将 JSON 更改为 JSON 数组(例如 [1,2,3]),要么将反序列化类型更改为正常的 .NET 类型(例如,不是像整数这样的原始类型,而不是可以从 JSON 对象反序列化的集合类型(如数组或列表)。也可以将 JsonObjectAttribute 添加到类型中以强制它从 JSON 对象反序列化。

路径“data.event.Time”,第 1 行,位置 39。

【问题讨论】:

  • 是的,让我们看看错误。 “数据”元素看起来不正确。不应该是数组吗?示例:“数据”:[“事件”:{...},...]甚至可能示例:“数据”:[{...},{...},...]
  • 您的 data 对象有两个同名的属性 event 。没有安全的方法可以访问它们。当然,您可以使用一些技巧来访问第一个/第二个,但这只是一个 hack。
  • 一旦你正确定义了你的json,你可以尝试使用json2csharp.com获取c#类
  • Arrggggghhhhhh。经典XY-Problem.... 你的问题现在可以映射到stackoverflow.com/questions/24536533/… 简单地使用字典.... 一个大的-1
  • @Marty - 这个决定是个错误。尝试将events 声明为Dictionary&lt;string, aEvents&gt;,您应该可以使用 original json。

标签: c# json json.net


【解决方案1】:

尝试将您的数据更改为:

{
"status": "OK",
"data": [
    {
        "Time": "2015-09-01 17:31:47",
        "Username": "user1",
        "IP_Address": "1.2.3.4",
        "Action": "action1",
        "Data": "somedata"
    },
    {
        "Time": "2015-09-01 17:30:30",
        "Username": "user2",
        "IP_Address": "1.2.3.5",
        "Action": "action2",
        "Data": "data"
    }
]}

然后将您的班级更改为:

public class aRoot
{
  [JsonProperty("status")]
  public string status { get; set; }
  [JsonProperty("data")]
  public List<aEvents> data { get; set; }
}

你不需要“aData”。

【讨论】:

  • 我认为 I'm trying to use an APITry changing your data to 矛盾
猜你喜欢
  • 2013-08-14
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多