2012-07-27 32 views
8

मेरे पास JSON का प्रतिनिधित्व करने वाली स्ट्रिंग है और मैं JSON.NET का उपयोग करके कुछ गुणों का नाम बदलना चाहता हूं। मुझे किसी भी JSON के लिए उपयोग करने के लिए एक सामान्य कार्य की आवश्यकता है। कुछ ऐसा:Json.net गुणों का नाम बदलें

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

यह कैसे करें ??

उत्तर

13

मैं आपके 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 
+0

धन्यवाद दिमित्री, यह सही है! –

+0

कुछ मामूली बग हो सकते हैं लेकिन यदि आप कोई पाते हैं तो आप उन्हें स्वयं ठीक कर सकते हैं :) –

3

हम इस दृष्टिकोण का उपयोग। आप जॉब्जेक्ट्स सिलेक्ट टोकन() का उपयोग करके अपनी इच्छित संपत्ति पा सकते हैं। हां यह जेसनपाथ का समर्थन करता है।

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

थोड़ा आश्चर्यचकित है कि आपने यह इंगित नहीं किया कि यह वास्तव में ढांचे का हिस्सा है, जो आपके द्वारा उतरा है: https://github.com/abibell /Newtonsoft.Json/commit/12f3f32401074a84b3d186956e59e56c9e8781cb :-) –

+0

हाय एलिस्टेयर, मैं सुविधा चाहता था। मैंने इसके लिए कॉफी बदलाव किए और एक पुल अनुरोध भेजा। इसे मालिक द्वारा स्वीकार नहीं किया गया था "मुझे यह पसंद नहीं है" .https: //github.com/JamesNK/Newtonsoft.Json/pull/549 –

+1

@AbiBellamkonda, मैं इस विस्तार विधि का उपयोग करने की कोशिश कर रहा हूं एक जेपीप्रर्टी ऑब्जेक्ट का नाम बदलें, लेकिन मुझे अपवाद मिलता है "Newtonsoft.Json.Linq.JProperty को Newtonsoft.Json.Linq.JProperty में नहीं जोड़ सकता।" कोड के इस बिट से: 'नया जेपीप्रर्टी (नया नाम, टोकन) '। – Gyromite

संबंधित मुद्दे