我正在尝试将服务中的JSON响应解析为c#观察集合列表对象。稍后可以使用列表对象在XAML页面上展示。
以下是该服务的回复:
[
{
"orderId": 1,
"employeeId": "6364",
"orderTime": 1517583600000,
"orderCost": 90,
"comments": null,
"orderStatus": {
"orderStatusId": 1,
"orderStatusName": "Order Placed"
},
"orderedItems": [
{
"orderItemId": 1,
"orderQuantity": 1,
"orderItemCost": 50
},
{
"orderItemId": 2,
"orderQuantity": 1,
"orderItemCost": 40
}
]
},
{
"orderId": 2,
"employeeId": "6364",
"orderTime": 1517670000000,
"orderCost": 50,
"comments": null,
"orderStatus": {
"orderStatusId": 3,
"orderStatusName": "Order Delivered"
},
"orderedItems": [
{
"orderItemId": 3,
"orderQuantity": 1,
"orderItemCost": 50
}
]
}
]
以下是模型类:
namespace ServiceNew
{
public class OrderStatus
{
public int orderStatusId { get; set; }
public string orderStatusName { get; set; }
}
public class OrderedItem
{
[JsonProperty("orderItemId")]
public int orderItemId { get; set; }
[JsonProperty("orderQuantity")]
public int orderQuantity { get; set; }
[JsonProperty("orderItemCost")]
public int orderItemCost { get; set; }
}
public class Order
{
[JsonProperty("orderId")]
public int orderId { get; set; }
[JsonProperty("employeeId")]
public string employeeId { get; set; }
[JsonProperty("orderTime")]
public object orderTime { get; set; }
[JsonProperty("orderCost")]
public int orderCost { get; set; }
[JsonProperty("comments")]
public object comments { get; set; }
[JsonProperty("orderStatus")]
public OrderStatus orderStatus { get; set; }
[JsonProperty("orderedItems")]
public List<OrderedItem> orderedItems { get; set; }
}
}
服务是这样的:
public class OrderService
{
public OrderService()
{
GetJson();
}
public async void GetJson()
{
if (NetworkCheck.IsInternet())
{
var client = new System.Net.Http.HttpClient();
var response = await client.GetAsync("here is thre URL");
string orderJson = await response.Content.ReadAsStringAsync(); //Getting response
Order ObjOrderList = new Order();
if (orderJson != " ")
{
Console.WriteLine("response is"+orderJson);
//exception occurs here all the time , and I need it to be a list
ObjOrderList = JsonConvert.DeserializeObject<Order>(orderJson);
}
Console.WriteLine("obj order list is"+ObjOrderList);
}
}
}
尝试对JSON数组反序列化进行一些更改后,我无法成功。现在有一个例外
Newtonsoft.Json.JsonSerializationException: <Timeout exceeded getting exception details>
我被困在这一段很长一段时间,在StackOverflow上搜索并搜索了它,但没有找到有效的解决方案。
我需要将JSON数据存储到c#对象中,并在列表中重现XAML页面中的同一对象。
提前致谢!
答案 0 :(得分:4)
我确信异常与您的JSON字符串无关,但尝试从解决方案文件夹中删除bin
和obj
,然后清理并重建解决方案。
但在解决之后你会得到以下异常
无法将当前JSON数组(例如[1,2,3])反序列化为类型'namespace.Order',因为该类型需要JSON对象(例如{“name”:“value”})才能正确反序列化。 ...
因为您的JSON字符串是Order
的列表所以反序列化将更改为:
List<Order> ObjOrderList = JsonConvert.DeserializeObject<List<Order>>(orderJson);
或在另一方面,您也可以使用JavaScriptSerializer
,如:
Order[] orderList = new JavaScriptSerializer().Deserialize<Order[]>(orderJson);
答案 1 :(得分:0)
您正在反序列化订单列表,因此您应该反序列化:
...
List<Order> ObjOrderList;
...
ObjOrderList = JsonConvert.DeserializeObject<List<Order>>(orderJson);
...
答案 2 :(得分:0)
您的JSON以[
开头,以]
结尾。这意味着您的JSON代表一个对象数组。这些对象是:
第一个对象
{
"orderId": 1,
"employeeId": "6364",
"orderTime": 1517583600000,
"orderCost": 90,
...
}
第二个对象
{
"orderId": 2,
"employeeId": "6364",
"orderTime": 1517670000000,
"orderCost": 50,
...
}
在您的潜意识中,您知道它,实际上您的反序列化变量的名称是ObjOrderList
(突出显示List
)。
因此,只需反序列化为Order
的数组/列表。
列表示例
var ObjOrderList = new List<Order>();
if (orderJson != " ")
{
//exception occurs here all the time , and I need it to be a list
ObjOrderList = JsonConvert.DeserializeObject<List<Order>>(orderJson);
}
数组示例
var ObjOrderList = new Order[] { };
if (orderJson != " ")
{
//exception occurs here all the time , and I need it to be a list
ObjOrderList = JsonConvert.DeserializeObject<Order[]>(orderJson);
}
答案 3 :(得分:0)
试试这个自动生成的代码:
// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
//
// using yourNameSpace;
//
// var orderResponse = OrderResponse.FromJson(jsonString);
namespace yourNameSpace
{
using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public partial class OrderResponse
{
[JsonProperty("orderId")]
public long OrderId { get; set; }
[JsonProperty("employeeId")]
public string EmployeeId { get; set; }
[JsonProperty("orderTime")]
public long OrderTime { get; set; }
[JsonProperty("orderCost")]
public long OrderCost { get; set; }
[JsonProperty("comments")]
public object Comments { get; set; }
[JsonProperty("orderStatus")]
public OrderStatus OrderStatus { get; set; }
[JsonProperty("orderedItems")]
public List<OrderedItem> OrderedItems { get; set; }
}
public partial class OrderStatus
{
[JsonProperty("orderStatusId")]
public long OrderStatusId { get; set; }
[JsonProperty("orderStatusName")]
public string OrderStatusName { get; set; }
}
public partial class OrderedItem
{
[JsonProperty("orderItemId")]
public long OrderItemId { get; set; }
[JsonProperty("orderQuantity")]
public long OrderQuantity { get; set; }
[JsonProperty("orderItemCost")]
public long OrderItemCost { get; set; }
}
public partial class OrderResponse
{
public static List<OrderResponse> FromJson(string json) => JsonConvert.DeserializeObject<List<OrderResponse>>(json);
}
代码是使用QuickType.io生成的 我放弃了转换器和其他一些额外的类。 如果需要,可以将Long类型更改为int。
要使用它,只需致电
var orderResponse = OrderResponse.FromJson(jsonString);
传递响应而不是jsonString
答案 4 :(得分:0)
在此代码中,您可以DeserializeObject
json文件:
using (StreamReader r = new StreamReader("D:/Source/ParsijooWeatherApi/ParsijooWeatherApi/cities2.json"))
{
string json = r.ReadToEnd();
List<jsonVariables> items = JsonConvert.DeserializeObject<List<jsonVariables>>(json);
dynamic array = JsonConvert.DeserializeObject(json);
foreach (var item in array)
{
Console.WriteLine("{0} {1}", item.latitude, item.longitude);
}
}
jsonVariables
类是:
public class jsonVariables
{
[JsonProperty("latitude")]
public string latitude { get; set; }
[JsonProperty("longitude")]
public string longitude { get; set; }
[JsonProperty("state")]
public string state { get; set; }
}
在此代码中,您可以访问根目录项目:
string _filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);
然后:
StreamReader r = new StreamReader(_filePath + "/cities2.json"))