c# - 如何有选择地从现有 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,
}
]
}
]
解决方案
为了从序列化中排除属性,您需要用属性标记[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; }
}
推荐阅读
- java - Java JFrame 不会更新输入的文本
- python - Python3 在 Linux 中调用 Python2 多处理的行为与在 Windows 中不同
- javascript - 自定义重试功能
- c - 遵循 C 代码为什么正确使用 graph->array[i].head 和 graph->array[i]->head 给出错误?
- bash - 为什么 ERR 陷阱会在 bash 中从“echo <(cat <
我有这个脚本(test.sh):
#!/bin/bash set -o errtrace trap 'echo $BASH_VERSION >&2' ERR echo <(cat<<EOF Hello world EOF )
运行它,我得到:
- javascript - Bare expo 应用程序不会为 Ios 编译:显示所有消息 找不到构建输入文件
- git - 将使用 Gitflow 的开发分支重命名为 dev
- php - 将文件从邮递员发布到 PHP
- java - GraalJSEngineFactory 无法实例化
- javascript - particle.js 的问题