Json.net Rename Properties

I have a string representing JSON and I want to rename some properties using JSON.NET. I need a generic function to use for any JSON. Something like:

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

How to do it?

+8
json c # rename
source share
2 answers

I would suggest restoring your JSON with renamed properties. I don’t think you should worry about speeding fines as this is usually not a problem. Here is how you can do it.

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

And here is a usage example:

 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 
+13
source share

We use this approach. You can find the property you want with JObject SelectToken (). Yes, it supports 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); } } 
+3
source share

All Articles