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