【问题标题】:How to deserialize json into C# List Object如何将 json 反序列化为 C# 列表对象
【发布时间】:2017-06-10 00:37:43
【问题描述】:

我似乎遇到了一个问题,我尝试将 json 数组反序列化为 C# 列表(我正在使用 Json.NET)。问题是我收到一个错误:

无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 'ProjectName.WebServices.EventWebMethods+ServiceItem' 因为类型 需要一个 JSON 对象(例如 {"name":"value"})来反序列化 正确。 要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或 实现集合接口的类型(例如 ICollection、IList) 比如可以从 JSON 数组反序列化的 List。 JsonArrayAttribute 也可以添加到类型中以强制它 从 JSON 数组反序列化。 路径“[0]”,第 1 行,位置 2。

这是我的 json 代码,它是通过获取一个 javascript 数组并在其上使用 JSON.stringify 创建的:

[["6249","Locked"],["6250","Locked"],["6251","Locked"]]

这是我正在使用的 C# 代码:

    [Serializable]
    public class ServiceItem
    {
        long lngId{ get; set; }
        string strStatus{ get; set; }

        public ServiceItem() { }
    }

    [WebMethod(EnableSession = true)]
    public string Create(string strJSON)
    {
        //Error happens on this next line:
        List<ServiceItem> ServiceData = JsonConvert.DeserializeObject<List<ServiceItem>>(strJSON);
        return "test";
    }

如何将其反序列化到 C# 类中。任何帮助表示赞赏!

更新

我对我的 javascript 进行了更改,使其包含建议的变量名。还是一样的错误。这是 C# 变量中的 JSON:

[
[\"lngId\" : \"6249\",\"strStatus\" : \"Locked\"],
[\"lngId\" : \"6250\",\"strStatus\" : \"Locked\"],
[\"lngId\" : \"6251\",\"strStatus\" : \"Locked\"]
]

花括号那么重要吗?如果这是问题所在,为什么 JSON.Stringify 不这样做?

更新 2

想通了。我需要像这样创建每个 json 项目:

arrServices.push({"lngId": intServiceID, "strStatus" : "Locked"});

现在可以了。感谢您的帮助!

【问题讨论】:

标签: javascript c# json list json.net


【解决方案1】:

您的示例 JSON 表示一个字符串数组。代表 ServiceItem 类所代表架构的 JSON 如下所示:

[  
   {  
      "lngID":"6249",
      "strStatus":"Locked"
   },
   {  
      "lngID":"6250",
      "strStatus":"Locked"
   },
   {  
      "lngID":"6251",
      "strStatus":"Locked"
   }
]

您需要在另一端以不同的方式序列化您的数据(使其与您的类匹配)。如果这不是一个选项,那么您将不得不手动反序列化服务器上​​的 JSON:

List<ServiceItem> ServiceData =
    JArray
    .Parse(input)
    .Select(x => x.ToArray())
    .Select(x => new ServiceItem()
        {
            lngId = x[0].Value<int>(),
            strStatus = x[1].Value<String>()
        })
    .ToList();

或者实现一个自定义的JsonConverter

【讨论】:

  • 非常感谢。我让它工作了!对于任何有兴趣的人,请参阅原始问题中的“更新 2”。
猜你喜欢
  • 2022-01-19
  • 2016-05-30
  • 1970-01-01
  • 2022-12-13
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多