我有一个表示JSON的字符串,我想使用JSON.NET重命名某些属性。我需要用于任何JSON的通用函数。就像是:
public static void Rename(JContainer container, Dictiontionary<string, string> 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<string, string> map) { return Rename(json, name => map.ContainsKey(name) ? map[name] : name); } public static JToken Rename(JToken json, Func<string, string> 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<string, string> { { "Test", "TestRenamed"} }; var renamedDict = Rename(json, dict); renamedDict.ToString().Dump(); // LINQPad output