C# Json字符串到数据表的转换

C# Json字符串到数据表的转换,c#,json,datatable,C#,Json,Datatable,我有以下json字符串 "data": { "message": "Ok", "success": true, "serverTime": 1550568846, "pageNo": 0, "pageSize": 100, "totalPages": 1, "totalCount": 7, "list": [ { "vehicleNumber": "NL01N7848", "deviceNumber": "3587350729504

我有以下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; }
    }
类数据
{
JsonData数据{get;set;}
}
类JsonData
{
公共字符串消息{get;set;}
公共bool成功{get;set;}
公共Int64服务器时间{get;set;}
公共int pageNo{get;set;}
公共int pageSize{get;set;}
公共整型totalPages{get;set;}
公共整数totalCount{get;set;}
列表{get;set;}
}
类别车辆详情
{
公共字符串vehicleNumber{get;set;}
公共字符串deviceNumber{get;set;}
公共字符串vendorCode{get;set;}
公共字符串venndorName{get;set;}
公共双纬度{get;set;}
公共双经度{get;set;}
公共双速{get;set;}
公共Int64 createdDate{get;set;}
公共字符串位置{get;set;}
公共字符串提供程序{get;set;}
公共字符串vehicleType{get;set;}
公共布尔精确{get;set;}
}
但每次我尝试反序列化上述json时,都会出现一个异常,表示传入了无效数组

编辑:

以下是反序列化的代码:

string jsonString;
JavaScriptSerializer jSerObj = new JavaScriptSerializer();
List<Data> lstData = (List<Data>) jSerObj.Deserialize(jsonString, typeof(List<Data>));
stringjsonstring;
JavaScriptSerializer jSerObj=新的JavaScriptSerializer();
List lstData=(List)jSerObj.Deserialize(jsonString,typeof(List));
编辑-2:

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


请在这方面帮助我。

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

或者

  • 将开始和结束替换为
    {
    }
    。或
  • 在开始时删除
    数据
    键,只需要一个
    JsonData数组
  • 如果你选择1。在上面,您的解析代码应该是

    Data lstData = (Data) jSerObj.Deserialize(jsonString, typeof(Data));
    
    如果你选择2。应该是:

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


    (注意,您的类中还缺少了几个
    public
    access修饰符)

    最后,我认为这是您的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));
    
    完成上述操作后,您仍然会得到
    列表
    为空

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

    class Data
    {
        public JsonData data { get; set; }
    }
    
    class JsonData
    {
        ...
        public List<VehicleDetails> list { get; set; }
    } 
    
    注意:您需要从Nuget软件包管理器安装
    newtonsoft.json
    软件包。然后需要使用Newtonsoft.Json.Linq导入
    名称空间到您的程序

    输出:您输出的数据表如下所示


    反序列化代码在哪里?您的示例是
    JSON数组中的
    JSON
    字符串,而不是
    JSON对象,因为它以
    [
    开头,以
    ]
    结尾。因此,如果您的代码使用类似于
    JsonConvert.DeserializeObject()的东西将其更改为类似于
    JsonConvert.DeserializeObject()的内容。您的Json格式无效。最好从检查和更正jsonUpload开始,您将得到一个错误
    错误:应为逗号或],而不是冒号。
    ,或者报告
    错误:第1行上的解析错误:应为'EOF'、'}'、'、'、']',get':'
    基本问题是外部容器分隔符是
    [
    表示数组,但
    表示“数据”:{}
    是一个对象属性。@er sho我已经添加了反序列化所用的代码,我尝试了您给出的第一个解决方案。它给出的数据为空。我尝试了第一个解决方案中给出的内容,但数据仍然是空的null@DeepakVerma请参阅编辑2。它起作用了…非常感谢,伙计…但是我应用了上面给出的解决方案魅力…我使用了您的替代解决方案是的,我想是的,您希望解析列表直接指向datatable这就是为什么我会为您提供替代方案,很高兴听到并欢迎:)
    class Data
    {
        public JsonData data { get; set; }
    }
    
    class JsonData
    {
        ...
        public List<VehicleDetails> list { get; set; }
    } 
    
    string json = File.ReadAllText(@"Path to your json file");
    
    JToken jToken = JToken.Parse(json);
    
    DataTable dataTable = jToken["data"]["list"].ToObject<DataTable>();