C#中根据元素值过滤JSON数组
Filter JSON Array based on element value in C#
我有这个JSON通过使用:var root = JToken.Parse(myInputJson);
{{
"results": [
{
"orderId": "A123456789",
"genId": 3,
"invoiceId": "001",
"locId": "D07",
"group": "",
"assignedUserId": "TEST",
"billTo": 66537,
"shipTo": 66537,
"shipToName": "CONSTRUCTION TEST",
"pickCount": "1",
"shipBy": "UPS",
"isFromMultipleZones": false,
"taskState": "Assigned",
"boxes": []
},
{
"orderId": "B987654321",
"genId": 3,
"invoiceId": "001",
"locId": "D08",
"group": "",
"assignedUserId": "",
"billTo": 66537,
"shipTo": 66537,
"shipToName": "CONSTRUCTION TEST",
"pickCount": "4",
"shipBy": "UPS",
"isFromMultipleZones": false,
"taskState": "Assigned",
"boxes": []
}
]
}
我需要的是获取 orderId = "B987654321" 大括号之间的所有元素。
经过研究,我已经做到了这一点,但没有生产出我需要的东西:
var root = JToken.Parse(myInputJson);
var values = root.Where(t => (string)t["orderId"] == "B987654321").ToList();
我觉得我很接近,谁能看出我的错误在哪里?
您忘记将 root
索引为 "results"
:
var root = JToken.Parse(text);
var values = root["results"].Where(t =>(string)t["orderId"] == "B987654321");
此外,您的示例 JSON 格式不正确。如果您删除第一个左大括号 ({
),它会起作用
要获取 JToken 订单,您可以使用此代码
var results = JObject.Parse(json).SelectToken("results").ToArray();
var jsonOrder = results.First(o => o.SelectToken("orderId").ToString() == "B987654321");
但是由于您使用的是 c# ,因此使用 Order class 的实例而不是 JToken
更容易也更安全
Order order=jsonOrder.ToObject<Order>();
订单class
public partial class Order
{
[JsonProperty("orderId")]
public string OrderId { get; set; }
[JsonProperty("genId")]
public long GenId { get; set; }
[JsonProperty("invoiceId")]
public string InvoiceId { get; set; }
[JsonProperty("locId")]
public string LocId { get; set; }
[JsonProperty("group")]
public string Group { get; set; }
[JsonProperty("assignedUserId")]
public string AssignedUserId { get; set; }
[JsonProperty("billTo")]
public long BillTo { get; set; }
[JsonProperty("shipTo")]
public long ShipTo { get; set; }
[JsonProperty("shipToName")]
public string ShipToName { get; set; }
[JsonProperty("pickCount")]
[JsonConverter(typeof(ParseStringConverter))]
public long PickCount { get; set; }
[JsonProperty("shipBy")]
public string ShipBy { get; set; }
[JsonProperty("isFromMultipleZones")]
public bool IsFromMultipleZones { get; set; }
[JsonProperty("taskState")]
public string TaskState { get; set; }
[JsonProperty("boxes")]
public List<object> Boxes { get; set; }
}
但是将整个json反序列化为网络对象比解析要容易得多。您可以使用 linq 获取任何数据。
List<Order> orders =JsonConvert.DeserializeObject<Root>(json).Orders;
Order order = orders.First(o => o.OrderId == "B987654321");
根目录class
public partial class Root
{
[JsonProperty("results")]
public List<Order> Orders { get; set; }
}
我有这个JSON通过使用:var root = JToken.Parse(myInputJson);
{{
"results": [
{
"orderId": "A123456789",
"genId": 3,
"invoiceId": "001",
"locId": "D07",
"group": "",
"assignedUserId": "TEST",
"billTo": 66537,
"shipTo": 66537,
"shipToName": "CONSTRUCTION TEST",
"pickCount": "1",
"shipBy": "UPS",
"isFromMultipleZones": false,
"taskState": "Assigned",
"boxes": []
},
{
"orderId": "B987654321",
"genId": 3,
"invoiceId": "001",
"locId": "D08",
"group": "",
"assignedUserId": "",
"billTo": 66537,
"shipTo": 66537,
"shipToName": "CONSTRUCTION TEST",
"pickCount": "4",
"shipBy": "UPS",
"isFromMultipleZones": false,
"taskState": "Assigned",
"boxes": []
}
]
}
我需要的是获取 orderId = "B987654321" 大括号之间的所有元素。
经过研究,我已经做到了这一点,但没有生产出我需要的东西:
var root = JToken.Parse(myInputJson);
var values = root.Where(t => (string)t["orderId"] == "B987654321").ToList();
我觉得我很接近,谁能看出我的错误在哪里?
您忘记将 root
索引为 "results"
:
var root = JToken.Parse(text);
var values = root["results"].Where(t =>(string)t["orderId"] == "B987654321");
此外,您的示例 JSON 格式不正确。如果您删除第一个左大括号 ({
),它会起作用
要获取 JToken 订单,您可以使用此代码
var results = JObject.Parse(json).SelectToken("results").ToArray();
var jsonOrder = results.First(o => o.SelectToken("orderId").ToString() == "B987654321");
但是由于您使用的是 c# ,因此使用 Order class 的实例而不是 JToken
更容易也更安全Order order=jsonOrder.ToObject<Order>();
订单class
public partial class Order
{
[JsonProperty("orderId")]
public string OrderId { get; set; }
[JsonProperty("genId")]
public long GenId { get; set; }
[JsonProperty("invoiceId")]
public string InvoiceId { get; set; }
[JsonProperty("locId")]
public string LocId { get; set; }
[JsonProperty("group")]
public string Group { get; set; }
[JsonProperty("assignedUserId")]
public string AssignedUserId { get; set; }
[JsonProperty("billTo")]
public long BillTo { get; set; }
[JsonProperty("shipTo")]
public long ShipTo { get; set; }
[JsonProperty("shipToName")]
public string ShipToName { get; set; }
[JsonProperty("pickCount")]
[JsonConverter(typeof(ParseStringConverter))]
public long PickCount { get; set; }
[JsonProperty("shipBy")]
public string ShipBy { get; set; }
[JsonProperty("isFromMultipleZones")]
public bool IsFromMultipleZones { get; set; }
[JsonProperty("taskState")]
public string TaskState { get; set; }
[JsonProperty("boxes")]
public List<object> Boxes { get; set; }
}
但是将整个json反序列化为网络对象比解析要容易得多。您可以使用 linq 获取任何数据。
List<Order> orders =JsonConvert.DeserializeObject<Root>(json).Orders;
Order order = orders.First(o => o.OrderId == "B987654321");
根目录class
public partial class Root
{
[JsonProperty("results")]
public List<Order> Orders { get; set; }
}