JSON.NET how to remove nodes JSON.NET how to remove nodes json json

JSON.NET how to remove nodes


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;        if (p != null && fields.Contains(p.Name))        {            removeList.Add(el);        }        removeFields(el, fields);    }    foreach (JToken el in removeList)    {        el.Remove();    }}


Building off of @[Mohamed Nuur]'s answer, I changed it to an extension method which I think works better:

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

Here is unit test:

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


I would create a new data structure with only the required information and copy the data from the first one. Often that is the simpliest approach. Just an idea.