I have a json like the following:
{ "d": { "results": [ { "__metadata": { }, "prop1": "value1", "prop2": "value2", "__some": "value" }, { "__metadata": { }, "prop3": "value1", "prop4": "value2", "__some": "value" }, ] } }
I just want to transform this JSON into a different JSON. I want to strip out the "_metadata" and "_some" nodes from the JSON. I'm using JSON.NET.
You can use the JSON Remove Node filter to remove a JSON node from a JSON message. You can specify the node to remove using a JSON Path expression. The JSON Path query language enables you to select nodes in a JSON document. For more details on JSON Path, see http://code.google.com/p/jsonpath.
To remove JSON element, use the delete keyword in JavaScript.
JToken is the abstract base class of JObject , JArray , JProperty , and JValue , which represent pieces of JSON data after they have been parsed. JsonToken is an enum that is used by JsonReader and JsonWriter to indicate which type of token is being read or written.
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); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With