如何有选择地从现有 JSON 字符串中删除某些属性?



我有一个嵌套的JSON字符串。 我想减小 JSON 的大小,只选择一些属性并省略其余属性。 我该怎么做?

示例 JSON 字符串:

[
{
"ID": 17,
"Code": "1",
"SupplierID": 24,
"Date": "2018-07-04T10:16:37.107",
"OrderDetails": [
{
"ID": 17,
"OrderID": 17,
"ItemID": 5806,
"Quantity": 20000.0,
"ConfirmQuantity": 20000.0,
"ConfirmDate": "2018-09-11T11:33:30.463",
"Deadline": "2018-07-22T00:00:00",
"IsCanceled": false,
"PersonnelID": 667,
"IsConfirmed": false
},
{
"ID": 190,
"OrderID": 170,
"ItemID": 5806,
"Quantity": 20000.0,
"ConfirmQuantity": 20000.0,
"ConfirmDate": "2018-09-11T11:33:30.463",
"Deadline": "2018-07-22T00:00:00",
"IsCanceled": false,
"PersonnelID": 6670,
"IsConfirmed": false
}
]
},
{
"ID": 19,
"Code": "2",
"SupplierID": 20,
"Date": "2018-07-14T13:25:50.030",
"OrderDetails": [
{
"ID": 18,
"OrderID": 19,
"ItemID": 15425,
"Quantity": 2100.0,
"ConfirmQuantity": 2100.0,
"Deadline": "2018-07-18T00:00:00",
"IsCanceled": false,
"PersonnelID": 445,
"IsConfirmed": false
}
]
}
]

期望的结果:

[
{
"ID": 17,
"Code": "1",
"OrderDetails": [
{
"ID": 17,
"ItemID": 5806,
"Quantity": 20000.0,
},
{
"ID": 190,
"ItemID": 5806,
"Quantity": 20000.0,
}
]
},
{
"ID": 19,
"Code": "2",
"OrderDetails": [
{
"ID": 18,
"ItemID": 15425,
"Quantity": 2100.0,
}
]
}
]

您可以使用 Json.Net 的 LINQ-to-JSON API 来执行类似操作:

var namesToKeep = new string[] { "ID", "Code", "OrderDetails", "ItemID", "Quantity" };
var jArray = JArray.Parse(jsonString);
foreach (var prop in jArray.Descendants().OfType<JProperty>().ToList())
{
if (!namesToKeep.Contains(prop.Name))
prop.Remove();
}
jsonString = jArray.ToString();

小提琴:https://dotnetfiddle.net/Pj9Wsu

为了从序列化中排除属性,您需要使用[JsonIgnore]属性标记属性。

像这样:

public class OrderDetail
{
public int ID { get; set; }
public int OrderID { get; set; }
public int ItemID { get; set; }
[JsonIgnore]
public double Quantity { get; set; }
[JsonIgnore]
public double ConfirmQuantity { get; set; }
[JsonIgnore]
public DateTime ConfirmDate { get; set; }
[JsonIgnore]
public DateTime Deadline { get; set; }
[JsonIgnore]
public bool IsCanceled { get; set; }
[JsonIgnore]
public int PersonnelID { get; set; }
[JsonIgnore]
public bool IsConfirmed { get; set; }
}
public class RootObject
{
public int ID { get; set; }
public string Code { get; set; }
[JsonIgnore]
public int SupplierID { get; set; }
[JsonIgnore]
public DateTime Date { get; set; }
public List<OrderDetail> OrderDetails { get; set; }
}

但我实际上建议你将原始集合投影到具有属性子集的对象集合中。

最简单的方法是定义仅包含要序列化的属性的新类,并从一个映射到另一个(使用纯 LINQSelect或某种映射器(:

public class OrderDetailModel
{
public int ID { get; set; }
public int OrderID { get; set; }
public int ItemID { get; set; }
}
public class RootObjectModel
{
public int ID { get; set; }
public string Code { get; set; }
public List<OrderDetailModel> OrderDetails { get; set; }
}

最新更新