Json.net重命名属性

我有一个表示JSON的字符串,我想使用JSON.NET重命名一些属性。 我需要一个generics函数来用于任何JSON。 就像是:

public static void Rename(JContainer container, Dictiontionary mapping) { foreach (JToken el in container.Children()) { JProperty p = el as JProperty; if(el != null && mapping.ContainsKey(p.Name)) { // **RENAME THIS NODE!!** } // recursively rename nodes JContainer pcont = el as JContainer; if(pcont != null) { Rename(pcont, mapping); } } } 

怎么做??

我建议用重命名的属性重建你的JSON。 我认为你不应该担心速度惩罚,因为它通常不是问题。 这是你如何做到的。

 public static JToken Rename(JToken json, Dictionary map) { return Rename(json, name => map.ContainsKey(name) ? map[name] : name); } public static JToken Rename(JToken json, Func map) { JProperty prop = json as JProperty; if (prop != null) { return new JProperty(map(prop.Name), Rename(prop.Value, map)); } JArray arr = json as JArray; if (arr != null) { var cont = arr.Select(el => Rename(el, map)); return new JArray(cont); } JObject o = json as JObject; if (o != null) { var cont = o.Properties().Select(el => Rename(el, map)); return new JObject(cont); } return json; } 

这是一个用法示例:

 var s = @"{ ""A"": { ""B"": 1, ""Test"": ""123"", ""C"": { ""Test"": [ ""1"", ""2"", ""3"" ] } } }"; var json = JObject.Parse(s); var renamed = Rename(json, name => name == "Test" ? "TestRenamed" : name); renamed.ToString().Dump(); // LINQPad output var dict = new Dictionary { { "Test", "TestRenamed"} }; var renamedDict = Rename(json, dict); renamedDict.ToString().Dump(); // LINQPad output 

我们使用这种方法。 您可以使用JObject的SelectToken()找到所需的属性。 是的它确实支持JsonPath。

 public static class NewtonsoftExtensions { public static void Rename(this JToken token, string newName) { var parent = token.Parent; if (parent == null) throw new InvalidOperationException("The parent is missing."); var newToken = new JProperty(newName, token); parent.Replace(newToken); } }