C# Json字符串到数据表的转换
我有以下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
"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数组
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>();