使用.NET将Json转换为List<object>

3

经过多天的尝试,将Json转换为对象列表,我在这里。我有一个返回Json字符串的REST API:

{
   GetItemsListResult:"[
      {
         "code":"VOL00056",
         "clsID":223108653,
         "type":2,
         "status":1,
         "free":0.0,
         "total":671088640.0,
         "perc":99,
         "descr":"no mailing",
         "dt":20160926,
         "tm":112456,
         "full":1
      },
      {
         "code":"VOL00055",
         "clsID":111760419,
         "type":2,
         "status":1,
         "free":0.0,
         "total":671088640.0,
         "perc":99,
         "descr":"Email",
         "dt":20160817,
         "tm":222411,
         "full":1
      }
   ]"
} 

我知道这个字符串来自一个 DataTable:

String JSONresult = JsonConvert.SerializeObject(ds.Tables[0]);

我创建了两个类:一个描述对象模型,另一个获取集合。但是当尝试时遇到问题。

VolumeCollection volumes = Newtonsoft.Json.JsonConvert.DeserializeObject<VolumeCollection>(listVolumes);

我获得了一个错误:

无法将System.String强制转换为System.Collections.Generic.List`1[Volume]。

出现了什么问题?

Volume类:

public class Volume
    {
        public String code  { get; set; }
        public Int32 classId  { get; set; }
        public Byte volumeType  { get; set; }
        public Byte status  { get; set; }
        public float freeSpace  { get; set; }
        public float totalSpace { get; set; }
        public Int16 fillPercentage { get; set; }
        public String classDescription { get; set; }
        public Int32 closeDate { get; set; }
        public Int32 closeTime { get; set; }
        public Boolean isFull { get; set; }
}

收到的JSON字符串为: "\" [{\\"FreeSpace\\":0.0,\\"TotalSpace\\":671088640.0,\\"FillPercentage\\":99,\\"ClassDescription\\":\\"外部邮件\\",\\"CloseDate\\":20161001,\\"CloseTime\\":212512,\\"IsFull\\":true,\\"VolumeType\\":2,\\"ClassId\\":111760419,\\"Code\\":\\"VOL00057\\",\\"Status\\":1}, {\\"FreeSpace\\":0.0,\\"TotalSpace\\":671088640.0,\\"FillPercentage\\":99,\\"ClassDescription\\":\\"非邮寄信函\\",\\"CloseDate\\":20160926,\\"CloseTime\\":112456,\\"IsFull\\":true,\\"VolumeType\\":2,\\"ClassId\\":223108653,\\"Code\\":\\"VOL00056\\",\\"Status\\":1} ]\""
似乎不是一个有效的JSON...

2
你能分享一下你的VolumeCollection类吗? - croxy
公共类 VolumeCollection { public List<Volume> GetItemsListResult { get; set; } } - Old-fashioned-dev
2
你的 JSON 字符串无效。 - Taras Kovalenko
你能分享一下Volume类吗?最好将它添加到你的问题中。还有VolumeCollection类。 - croxy
1
你的JSON字符串无效。这就是为什么它无法反序列化的原因。你能发布生成该JSON的控制器吗?那部分有问题。 - rmc00
3个回答

3
鉴于你的json无效,而以下内容是有效的:
{
    "GetItemsListResult": [{
        "code": "VOL00056",
        "clsID": 223108653,
        "type": 2,
        "status": 1,
        "free": 0.0,
        "total": 671088640.0,
        "perc": 99,
        "descr": "no mailing",
        "dt": 20160926,
        "tm": 112456,
        "full": 1
    }, {
        "code": "VOL00055",
        "clsID": 111760419,
        "type": 2,
        "status": 1,
        "free": 0.0,
        "total": 671088640.0,
        "perc": 99,
        "descr": "Email",
        "dt": 20160817,
        "tm": 222411,
        "full": 1
    }]
}

使用我生成的以下类,这个可以工作:

    public class GetItemsListResult
    {
        public string code { get; set; }
        public int clsID { get; set; }
        public int type { get; set; }
        public int status { get; set; }
        public double free { get; set; }
        public double total { get; set; }
        public int perc { get; set; }
        public string descr { get; set; }
        public int dt { get; set; }
        public int tm { get; set; }
        public int full { get; set; }
    }

    public class RootObject
    {
        public List<GetItemsListResult> GetItemsListResult { get; set; }
    }

var res = JsonConvert.DeserializeObject<RootObject>(json);

这行代码是将一个JSON字符串解析成一个名为"RootObject"的对象。

需要注意的是,这个网站可以根据JSON生成相应的类:json2csharp


好的,既然这个JSON来自DataTable,我能改变它吗?我能将GetItemsListResult重命名为一个有意义的名称吗? - Old-fashioned-dev
我不确定我理解你的意思,你是在说你无法控制JSON的创建吗? - Ric
多少来说...我可以“说服”准备JSON的人 :-) 数据来自数据库表。我如何更改数据的准备? - Old-fashioned-dev
不要仅仅在一开始使用 DataTable,而是从表中的每一行创建对象,然后将其序列化为 json,这样更易于维护。 - Ric
好的,那么不使用 DataTable,改用 DataReader 进行循环并创建对象列表。对吧? - Old-fashioned-dev
显示剩余3条评论

1

你的 GetItemsListResult 是一个字符串,而不是数组。注意双引号:

GetItemsListResult: "[

因此,理想情况下,您希望将您的json修复为真正的数组。

如果您无法控制json,则作为一个不好的替代方案,您可以递归解析字符串以提取数组。


1
  1. 您有一个无效的JSON字符串:

1.1 正确的JSON格式如下:

{
"GetItemsListResult":[
{"code":"VOL00056","clsID":223108653,"type":2,"status":1,"free":0.0,"total":671088640.0,"perc":99,"descr":"no mailing","dt":20160926,"tm":112456,"full":1},
{"code":"VOL00055","clsID":111760419,"type":2,"status":1,"free":0.0,"total":671088640.0,"perc":99,"descr":"Email","dt":20160817,"tm":222411,"full":1}
]
}
  1. 使用http://json2csharp.com/构建数据模型

2.1 就像这样:

public class GetItemsListResult
{
    public string code { get; set; }
    public int clsID { get; set; }
    public int type { get; set; }
    public int status { get; set; }
    public double free { get; set; }
    public double total { get; set; }
    public int perc { get; set; }
    public string descr { get; set; }
    public int dt { get; set; }
    public int tm { get; set; }
    public int full { get; set; }
}

public class RootObject
{
    public List<GetItemsListResult> GetItemsListResult { get; set; }
}
  1. 使用 http://www.newtonsoft.com/json 来解析你的 JSON 数据

3.1 就像这样:

var jsonObj = JsonConvert.DeserializeObject<RootObject>(jsonString);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接