为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
噜噜哒 2023-09-16 15:50:06
我有一个嵌套的 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,            }        ]    },
查看完整描述

2 回答

?
达令说

TA贡献1821条经验 获得超6个赞

您可以使用 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


查看完整回答
反对 回复 2023-09-16
?
MMTTMM

TA贡献1869条经验 获得超4个赞

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


像这样的东西:


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; }

}


查看完整回答
反对 回复 2023-09-16
  • 2 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信