【问题标题】:Remove specific properties from JSON object从 JSON 对象中删除特定属性
【发布时间】:2022-01-23 12:47:33
【问题描述】:

我有一个 JSON:

{
    "scbs_currentstatus": "",
      "scbs_primaryissue": "",
      "_umb_id": "Test",
      "_umb_creator": "Admin",
      "_umb_createdate": "0001-01-01 00:00:00",
      "_umb_updatedate": "0001-01-01 00:00:00",
      "_umb_doctype": "Test",
      "_umb_login": "Test",
      "_umb_email": "Test",
      "_umb_password": {
        "newPassword": "Test",
        "oldPassword": null,
        "reset": null,
        "answer": null
      },
      "_umb_membergroup": {
        " User": false,
        "Line User": true,
        "Callback User": false,
        "Su User": false,
        },
      "umbracoMemberComments": "Test",
      "umbracoMemberFailedPasswordAttempts": ""

    }

我正在尝试删除所有以 "umb_" 开头的属性。这在 json.net 中是否可行?

输出如下:

{
        "scbs_currentstatus": "",
          "scbs_primaryissue": "",
           "umbracoMemberComments": "Test",
          "umbracoMemberFailedPasswordAttempts": ""
}

使用 remove 我可以做到,但不是一次全部完成。

   result.Property("_umb_id").Remove();

有什么建议吗?

【问题讨论】:

    标签: c# json c#-4.0 json.net


    【解决方案1】:

    可以先解析字符串:

    var temp =  JArray.Parse(json);
    temp.Descendants()
        .OfType<JProperty>()
        .Where(attr => attr.Name.StartsWith("_umb_"))
        .ToList() // you should call ToList because you're about to changing the result, which is not possible if it is IEnumerable
        .ForEach(attr => attr.Remove()); // removing unwanted attributes
    json = temp.ToString(); // backing result to json
    

    更新或:

    result.Properties()
        .Where(attr => attr.Name.StartsWith("_umb_"))
        .ToList()
        .ForEach(attr => attr.Remove());
    

    更新 #2

    您可以在where子句中指定更多条件:

    .Where(attr => attr.Name.StartsWith("_umb_") && some_other_condition)
    

    .Where(attr => attr.Name.StartsWith("_umb_") || some_other_condition)
    

    或者你需要的任何东西。

    【讨论】:

    • @javed。我们可以在其中指定多个条件吗?假设我们在属性中不包含“umbracoMember”。
    【解决方案2】:

    如果 JArray.Parse 不起作用,您可以按如下方式强输入您的对象:

    var temp = (Newtonsoft.Json.Linq.JObject)JsonConvert.DeserializeObject(json);
    temp.Descendants()
     .OfType<JProperty>()
     .Where(attr => attr.Name.StartsWith("_umb_"))
     .ToList() // you should call ToList because you're about to changing the result, which is not possible if it is IEnumerable
     .ForEach(attr => attr.Remove()); // removing unwanted attributes
    

    【讨论】:

      【解决方案3】:

      我刚刚反序列化为 JObject 并递归地循环遍历它以删除不需要的字段。感兴趣的朋友可以看看这里的功能。

      private void removeFields(JToken token, string[] fields)
      {
      JContainer container = token as JContainer;
      if (container == null) return;
      
      List<JToken> removeList = new List<JToken>();
      foreach (JToken el in container.Children())
      {
          JProperty p = el as JProperty;
          string propertyName = p.hasOwnProperty(key);
      
          if (p != null && fields.Contains(p.propertyName) && p.propertyName.substring(0,4) == "_umb" )
          {
              removeList.Add(el);
          }
          removeFields(el, fields);
      }
      
      foreach (JToken el in removeList)
      {
          el.Remove();
      }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-03
        • 1970-01-01
        • 1970-01-01
        • 2017-12-06
        • 2011-01-16
        • 2015-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多