2013-01-19 21 views
8

मैं JSON स्ट्रिंग परिवर्तित करने के लिएसी # क्रमबद्ध JSON स्ट्रिंग कुंजी

"{ \"birthday\": \"1988-03-18\", \"address\": { \"state\": 24, \"city\": 8341, \"country\": 1 } }" 

"{ \"address\": { \"city\": 8341, \"country\": 1, \"state\": 24 }, \"birthday\": \"1988-03-18\" }" 

को नोट करना चाहते हैं: मैं संचार के लिए क्रमबद्ध संस्करण का उपयोग नहीं कर रहा हूँ (क्योंकि कुंजी आदेश नहीं करता है वास्तव में कोई फर्क नहीं पड़ता), मुझे स्थानीय परीक्षण करने के लिए एक क्रमबद्ध संस्करण की आवश्यकता है (जेएसओएन तारों की तुलना करके)।


संपादित करें: I4V एक समाधान Json.Net का उपयोग करता है, मैं नहीं बल्कि एक समाधान है कि किसी भी 3 पार्टी पुस्तकालय (वास्तव में मैं में System.Json में बनाया का उपयोग कर रहा शामिल करने के लिए की जरूरत नहीं है का प्रयोग करेंगे बताया मेरी आवेदन)


मैं I4V + कुछ परीक्षण here द्वारा प्रदान समाधान के साथ एक सार पोस्ट। आप सभी को धन्यवाद।

+0

हम्म ... हालांकि यह लगता है कि टेम्प्टिंग, मैं उद्यम करता हूं कि बेहतर समाधान एक स्ट्रिंग तुलना के बजाय JSON का थोड़ा गहरा निरीक्षण होगा। यह देखते हुए कि जेएस में गुणों की गणना spec द्वारा निर्धारित नहीं है, ऑब्जेक्ट गुणों का क्रम पर भरोसा नहीं किया जाना चाहिए क्योंकि यह एक जेसन serialization के गुणों को आदेश देने के लिए वास्तव में अर्थहीन है। ईसीएमए -262, सेक्शन 12.6.4: गुणों की गणना करने के यांत्रिकी ... कार्यान्वयन निर्भर है। – spender

+0

@ स्पेंडर मैं आपसे सहमत हूं कि JSON कुंजी ऑर्डर अर्थहीन है और स्ट्रिंग तुलना का उपयोग बड़े/जटिल JSON ऑब्जेक्ट्स की तुलना करने के लिए नहीं किया जाना चाहिए। लेकिन एक JSON स्ट्रिंग सॉर्टर बहुत विशिष्ट स्थितियों (मेरे रूप में) –

उत्तर

10

मैं इस

string json = @"{ ""birthday"": ""1988-03-18"", ""address"": { ""state"": 24, ""city"": 8341, ""country"": 1 } }"; 
var jObj = (JObject)JsonConvert.DeserializeObject(json); 
Sort(jObj); 
string newJson = jObj.ToString(); 

void Sort(JObject jObj) 
{ 
    var props = jObj.Properties().ToList(); 
    foreach (var prop in props) 
    { 
     prop.Remove(); 
    } 

    foreach (var prop in props.OrderBy(p=>p.Name)) 
    { 
     jObj.Add(prop); 
     if(prop.Value is JObject) 
      Sort((JObject)prop.Value); 
    } 
} 

संपादित करें के लिए Json.Net का उपयोग करेगा

एक System.Json के साथ प्रयास करें, लेकिन मैं OrderByDescending (या OrderBy) के बारे में निश्चित नहीं हूँ।

var jObj = (System.Json.JsonObject)System.Json.JsonObject.Parse(json); 
Sort2(jObj); 
var newJson = jObj.ToString(); 

void Sort2(System.Json.JsonObject jObj) 
{ 
    var props = jObj.ToList(); 
    foreach (var prop in props) 
    { 
     jObj.Remove(prop.Key); 
    } 

    foreach (var prop in props.OrderByDescending(p => p.Key)) 
    { 
     jObj.Add(prop); 
     if (prop.Value is System.Json.JsonObject) 
      Sort2((System.Json.JsonObject)prop.Value); 
    } 
} 
+0

दिलचस्प के लिए उपयोगी हो सकता है। लेकिन मैं निर्मित सिस्टम का उपयोग कर रहा हूँ।जेसन मेरे ऐप में, इसलिए मैं ऐसे समाधान का उपयोग करूंगा जिसे किसी तृतीय पक्ष lib की आवश्यकता नहीं है। –

+0

क्या आप जॉब से संपत्तियों को निकालने का मतलब रखते थे, न कि संपत्ति सूची? ऐसा लगता है कि आप संपत्ति सूची से सभी आइटम हटा रहे हैं और फिर इसे क्रमबद्ध करने और गणना करने का प्रयास कर रहे हैं। – Despertar

+0

मैंने आपके प्रश्न को आपके समाधान और मेरी बाधाओं के साथ संपादित किया –

2

this approach you can retrieve a dynamic object with your json data

का उपयोग कर DynamicJsonConverter पर रखकर एक SortedDictionary बजाय

var d = new SortedDictionary<string, object>(dictionary); 
// TODO: code to sort inner objects 
return new DynamicJsonObject(d); 

तो आप उपयोग कर सकते बनाने

string jsonStr = "{\"B\":\"2\",\"A\":\"1\"}"; 
JavaScriptSerializer jss = new JavaScriptSerializer(); 
jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() }); 

dynamic json = jss.Deserialize(jsonStr, typeof(object)) as dynamic; 

string result = new JavaScriptSerializer().Serialize((json as DynamicJsonObject).Dictionary); 

और result अपेक्षित आउटपुट होगा।

+1

धन्यवाद @ ब्रूनोएलएम, हालांकि मैं सादा 'System.Json.JsonObject' का उपयोग कर समाप्त हुआ। –

0

मुझे पता है की आप (मैं सिर्फ यह आवश्यक) भी डेटा की आंतरिक सरणियों सॉर्ट करने के लिए की जरूरत है इस एक छोटे से देर से लेकिन मामले में, हो सकता है:

static void Sort(JObject jObj) 
{ 
    var props = jObj.Properties().ToList(); 
    foreach (var prop in props) 
    { 
     prop.Remove(); 
    } 

    foreach (var prop in props.OrderBy(p => p.Name)) 
    { 
     jObj.Add(prop); 
     if (prop.Value is JObject) 
      Sort((JObject)prop.Value); 
     if (prop.Value is JArray) 
     { 
      Int32 iCount = prop.Value.Count(); 
      for (Int32 iIterator = 0; iIterator < iCount; iIterator++) 
       if (prop.Value[iIterator] is JObject) 
        Sort((JObject)prop.Value[iIterator]); 
     } 
    } 
} 

चीयर्स!

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