簡體   English   中英

JSON字符串到Datatable的轉換

[英]Json string to Datatable conversion

我有以下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時,都會出現一個異常,指出傳入了無效數組

編輯:

這是反序列化的代碼:

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

EDIT 2:

我從json字符串中刪除了外部[]

請幫我。

最后我認為這是您的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));

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

因此,將訪問修飾符public添加到JsonData類的屬性list中,並將dataData類的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;進行導入using Newtonsoft.Json.Linq; 程序的名稱空間

輸出:您輸出的數據表看起來像

在此處輸入圖片說明

您的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訪問修飾符)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM