【问题标题】:Json string to Datatable conversionJson 字符串到数据表的转换
【发布时间】:2019-02-19 09:46:23
【问题描述】:

我有以下 json 字符串。

"data": {
  "message": "Ok",
  "success": true,
  "serverTime": 1550568846,
  "pageNo": 0,
  "pageSize": 100,
  "totalPages": 1,
  "totalCount": 7,
  "list": [
    {
      "vehicleNumber": "NL01N7848",
      "deviceNumber": "358735072950479",
      "vendorCode": "WE12881",
      "venndorName": "kapoor Diesels",
      "latitude": 12.195035555555556,
      "longitude": 76.642826666666664,
      "speed": 0.0,
      "createdDate": 1550497439,
      "location": "Unnamed Road, Byathahalli, Karnataka 571311, India",
      "provider": "WHEELSEYE",
      "vehicleType": "NA",
      "accurate": false
    },
    {
      "vehicleNumber": "NL01L0067",
      "deviceNumber": "358735073314899",
      "vendorCode": "WE12881",
      "venndorName": "kapoor Diesels",
      "latitude": 26.222473333333333,
      "longitude": 91.702311111111115,
      "speed": 0.0,
      "createdDate": 1550568823,
      "location": "21, Brahmaputra Industrial Park, Gauripur, Amingaon, Guwahati - Baihata Rd, Guwahati, Assam 781030, India",
      "provider": "WHEELSEYE",
      "vehicleType": "NA",
      "ignition": false,
      "accurate": false
    },
    {
      "vehicleNumber": "NL01L1004",
      "deviceNumber": "358735073306135",
      "vendorCode": "WE12881",
      "venndorName": "kapoor Diesels",
      "latitude": 20.532204444444446,
      "longitude": 85.952977777777775,
      "speed": 0.0,
      "createdDate": 1550568795,
      "location": "Badshahi Road, Alarpur, Odisha 754025, India",
      "provider": "WHEELSEYE",
      "vehicleType": "NA",
      "ignition": true,
      "accurate": false
    },
    {
      "vehicleNumber": "NL01L2044",
      "deviceNumber": "358735073318866",
      "vendorCode": "WE12881",
      "venndorName": "kapoor Diesels",
      "latitude": 22.567486666666664,
      "longitude": 88.136897777777776,
      "speed": 0.0,
      "createdDate": 1550568787,
      "location": "Amta-Ranihati Road, Ranihati, Mallik Bagan, West Bengal 711302, India",
      "provider": "WHEELSEYE",
      "vehicleType": "NA",
      "ignition": false,
      "accurate": false
    },
    {
      "vehicleNumber": "NL01L2042",
      "deviceNumber": "358735073311713",
      "vendorCode": "WE12881",
      "venndorName": "kapoor Diesels",
      "latitude": 20.532215555555556,
      "longitude": 85.953057777777772,
      "speed": 0.0,
      "createdDate": 1550568825,
      "location": "Badshahi Road, Alarpur, Odisha 754025, India",
      "provider": "WHEELSEYE",
      "vehicleType": "NA",
      "ignition": false,
      "accurate": false
    },
    {
      "vehicleNumber": "NL01L6027",
      "deviceNumber": "NA",
      "vendorCode": "WE12881",
      "venndorName": "kapoor Diesels",
      "latitude": 13.265313,
      "longitude": 80.11657,
      "speed": 0.0,
      "createdDate": 1550565467,
      "location": "Tirupati Rd, Manjankaranai, Tamil Nadu 601103, India",
      "provider": "WHEELSEYE",
      "vehicleType": "NA",
      "accurate": false
    },
    {
      "vehicleNumber": "HR38U3103",
      "deviceNumber": "NA",
      "vendorCode": "WE12881",
      "venndorName": "kapoor Diesels",
      "latitude": 27.594013,
      "longitude": 77.59916,
      "speed": 44.0,
      "createdDate": 1550568763,
      "location": "NH19, Bharthia, Uttar Pradesh 281406, India",
      "provider": "WHEELSEYE",
      "vehicleType": "NA",
      "ignition": true,
      "accurate": false
    }
  ]
}

我想将其转换为 C# 类对象。 我正在使用以下类结构:

class Data
    {
        JsonData data { get; set; }
    }
    class JsonData
    {
        public string message { get; set; }
        public bool success { get; set; }
        public Int64 serverTime { get; set; }
        public int pageNo { get; set; }
        public int pageSize { get; set; }
        public int totalPages { get; set; }
        public int totalCount { get; set; }
        List<VehicleDetails> list { get; set; }
    }
    class VehicleDetails
    {
        public string vehicleNumber { get; set; }
        public string deviceNumber { get; set; }
        public string vendorCode { get; set; }
        public string venndorName { get; set; }
        public double latitude { get; set; }
        public double longitude { get; set; }
        public double speed { get; set; }
        public Int64 createdDate { get; set; }
        public string location { get; set; }
        public string provider { get; set; }
        public string vehicleType { get; set; }
        public bool accurate { get; set; }
    }

但是每次我尝试反序列化上述 json 时,都会出现一个异常,提示 Invalid array pass in

编辑:

下面是反序列化的代码:

string jsonString;
JavaScriptSerializer jSerObj = new JavaScriptSerializer();
List<Data> lstData = (List<Data>) jSerObj.Deserialize(jsonString, typeof(List<Data>));

EDIT-2:

我已经从我的 json 字符串中删除了外部 []

请帮帮我。

【问题讨论】:

  • 你的反序列化代码在哪里?
  • 您的示例JSON 字符串在JSON-Array 中,而不是JSON-object,因为它以[ 开头并以] 结尾。因此,如果您的代码使用 JsonConvert.DeserializeObject&lt;Data&gt;(&lt;your json string here&gt;); 之类的内容,请将其更改为 JsonConvert.DeserializeObject&lt;List&lt;Data&gt;&gt;(&lt;your json string here&gt;); 之类的内容。
  • 您的 Json 格式无效。你最好从检查和纠正你的 json 开始
  • 上传到jsonformatter.curiousconcept.com会报错Error:Expecting comma or ], not colon.,或者jsonlint.comError: Parse error on line 1: Expecting 'EOF', '}', ',', ']', got ':'基本问题是外容器分隔符是[表示数组,但"data": {} 是一个对象属性。
  • @er-sho 我添加了用于反序列化的代码

标签: c# json datatable


【解决方案1】:

最后我认为这是你的json,

{
  "data": {
    "message": "Ok",
    "success": true,
    "serverTime": 1550568846,
    "pageNo": 0,
    "pageSize": 100,
    "totalPages": 1,
    "totalCount": 7,
    "list": [
      {
        "vehicleNumber": "NL01N7848",
        ...
      },
      {
        "vehicleNumber": "NL01L0067",
        ...
      },
    ]
  }
}

然后你可以将这个 json 脱轨为,

Data lstData = (Data)jSerObj.Deserialize(jsonString, typeof(Data));

完成上述操作后,您仍然会得到 list 为 null

所以将访问修饰符 public 添加到 JsonData 类中的属性 listData 类中的 data 属性中,因此在应用公共访问修饰符之后

class Data
{
    public JsonData data { get; set; }
}

class JsonData
{
    ...
    public List<VehicleDetails> list { get; set; }
} 

替代方案:

从您的 json 中,如果您想将 list 关键数据直接解析为 DataTable,那么您可以使用以下代码

string json = File.ReadAllText(@"Path to your json file");

JToken jToken = JToken.Parse(json);

DataTable dataTable = jToken["data"]["list"].ToObject<DataTable>();

注意:您需要从 Nuget 包管理器安装 newtonsoft.json 包。然后你需要将using Newtonsoft.Json.Linq;命名空间导入你的程序

输出:你输出的数据表是什么样子的

【讨论】:

  • 工作就像一个魅力......我使用了你的替代解决方案
  • 是的,我想是的,您希望解析列表以直接数据表,这就是为什么我会为您提供替代方案,很高兴听到并欢迎 :)
【解决方案2】:

您的 json 字符串无效。它以 [] 开头和结尾,这意味着一个数组。数组元素没有键/值对。只是元素。

要么

  1. 将开始和结束替换为{}。或者;
  2. 删除开头的data 键,只剩下JsonData 的数组

如果你选择上面的1.,你的解析代码应该变成

Data lstData = (Data) jSerObj.Deserialize(jsonString, typeof(Data));

如果你选择了 2. 它应该是:

List<JsonData> lstData = (List<JsonData>) jSerObj.Deserialize(jsonString, typeof(List<JsonData>));

修改后:

您的数据仍然无效 - 现在它周围什么都没有。您可以使用上面的选项 1 解析它,方法是在您拥有的内容周围附加 {}


编辑 2

您应该使用 Json.NET 进行反序列化 - 它远远优于 JsonSerializer

代码是:

var result = JsonConvert.DeserializeObject<Data>(jsonString);

现场示例:https://rextester.com/WRXSO2016

(请注意,您的课程中还缺少几个 public 访问修饰符)

【讨论】:

  • 我尝试了你给出的第一个解决方案..它给出的数据为空
  • 我尝试了第一个解决方案中给出的内容......仍然数据为空
  • @DeepakVerma 请参阅编辑 2。
  • 它工作了......非常感谢队友......但是我应用了上面给出的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
相关资源
最近更新 更多