JSON.NET如何删除节点

我有一个类似以下的json:

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

我只想将这个JSON转换为不同的JSON。 我想从JSON中删除“_ metadata”和“ _some”节点。 我正在使用JSON.NET。

我刚刚反序列化到JObject并递归循环以删除不需要的字段。 这是感兴趣的人的function。

 private void removeFields(JToken token, string[] fields) { JContainer container = token as JContainer; if (container == null) return; List removeList = new List(); 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(); } } 

基于@ [Mohamed Nuur]的回答,我将其改为扩展方法,我认为这种方法更好:

  public static JToken RemoveFields(this JToken token, string[] fields) { JContainer container = token as JContainer; if (container == null) return token; List removeList = new List(); 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; } 

这是unit testing:

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

我将创建一个只包含所需信息的新数据结构,并从第一个数据中复制数据。 通常这是最简单的方法。 只是一个想法。