JSON.NET如何删除节点(JSON.NET how to remove nodes)

2019-06-26 14:05发布

我有一个像下面这样的JSON:

{
  "d": {
    "results": [
      {
        "__metadata": {
        },
        "prop1": "value1",
        "prop2": "value2",
        "__some": "value"
      },
      {
        "__metadata": {
        },
        "prop3": "value1",
        "prop4": "value2",
        "__some": "value"
      },
    ]
  }
}

我只是想这JSON转换成不同的JSON。 我想去掉了“_ 元数据”,并JSON“_some”节点。 我使用JSON.NET。

Answer 1:

我刚刚结束了对反序列化和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;
        if (p != null && fields.Contains(p.Name))
        {
            removeList.Add(el);
        }
        removeFields(el, fields);
    }

    foreach (JToken el in removeList)
    {
        el.Remove();
    }
}


Answer 2:

建立客@穆罕默德Nuur]的答案,我把它改成一个扩展方法,我认为更好的作品:

 public static JToken RemoveFields(this JToken token, string[] fields)
    {
        JContainer container = token as JContainer;
        if (container == null) return token;

        List<JToken> removeList = new List<JToken>();
        foreach (JToken el in container.Children())
        {
            JProperty p = el as JProperty;
            if (p != null && fields.Contains(p.Name))
            {
                removeList.Add(el);
            }
            el.RemoveFields(fields);
        }

        foreach (JToken el in removeList)
        {
            el.Remove();
        }

        return token;
    }

这里是单元测试:

[TestMethod]
     public void can_remove_json_field_removeFields()
     {
        string original = "{\"d\":{\"results\":[{\"__metadata\":{},\"remove\":\"done\",\"prop1\":\"value1\",\"prop2\":\"value2\",\"__some\":\"value\"},{\"__metadata\":{},\"prop3\":\"value1\",\"prop4\":\"value2\",\"__some\":\"value\"}],\"__metadata\":{\"prop3\":\"value1\",\"prop4\":\"value2\"}}}";
        string expected = "{\"d\":{\"results\":[{\"prop1\":\"value1\",\"prop2\":\"value2\",\"__some\":\"value\"},{\"prop3\":\"value1\",\"prop4\":\"value2\",\"__some\":\"value\"}]}}";
        string actual = JToken.Parse(original).RemoveFields(new string[]{"__metadata", "remove"}).ToString(Newtonsoft.Json.Formatting.None);
        Assert.AreEqual(expected, actual);
     }


Answer 3:

我想创建一个只所需信息的新的数据结构,并从第一个复制数据。 通常这是simpliest方法。 只是一个想法。



文章来源: JSON.NET how to remove nodes