Remove specific properties from JSON object

落爺英雄遲暮 提交于 2020-01-19 13:10:27

问题


I have a 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": ""

    }

Iam trying to remove all the properties start with "umb_" .is this possible in json.net?

and output will be like:

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

using remove i am able to to do it however not all at a time.

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

any suggestion please?


回答1:


You can parse the string first:

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

UPDATE OR:

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

UPDATE #2

You can specify more conditions in where clause:

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

OR

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

Or whatever you need.




回答2:


I just ended up deserializing to JObject and recursively looping through that to remove unwanted fields. Here's the function for those interested.

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


来源:https://stackoverflow.com/questions/36277581/remove-specific-properties-from-json-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!