Moh*_*uur 17 c# json.net jsonpath
我有一个类似以下的json:
{
"d": {
"results": [
{
"__metadata": {
},
"prop1": "value1",
"prop2": "value2",
"__some": "value"
},
{
"__metadata": {
},
"prop3": "value1",
"prop4": "value2",
"__some": "value"
},
]
}
}
Run Code Online (Sandbox Code Playgroud)
我只想将这个JSON转换为不同的JSON.我想从JSON中删除" _ metadata"和" _some"节点.我正在使用JSON.NET.
Moh*_*uur 35
我刚刚反序列化到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();
}
}
Run Code Online (Sandbox Code Playgroud)
Raf*_*afi 16
基于@ [Mohamed 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;
}
Run Code Online (Sandbox Code Playgroud)
这是单元测试:
[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);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
24140 次 |
最近记录: |