首页 > 解决方案 > 如何有选择地从现有 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,
            }
        ]
    }
]

标签: c#json

解决方案


为了从序列化中排除属性,您需要用属性标记[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; }
}

推荐阅读