2017-01-06 15 views
6

के रूप में मैं JSON के साथ बहुत नया हूं, कृपया मदद करें!सीरियलइज सूची <KeyValuePair <string, string >> JSON

[{"Key":"MyKey 1","Value":"MyValue 1"},{"Key":"MyKey 2","Value":"MyValue 2"}] 

उम्मीद:

मैं serialise करने के लिए एक List<KeyValuePair<string, string>> JSON

रूप वर्तमान में

कोशिश कर रहा हूँ

[{"MyKey 1":"MyValue 1"},{"MyKey 2":"MyValue 2"}] 

मैं this और this से कुछ उदाहरण के रूप में भेजा।

यह मेरा KeyValuePairJsonConverter है: JsonConverter

public class KeyValuePairJsonConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     List<KeyValuePair<object, object>> list = value as List<KeyValuePair<object, object>>; 
     writer.WriteStartArray(); 
     foreach (var item in list) 
     { 
      writer.WriteStartObject(); 
      writer.WritePropertyName(item.Key.ToString()); 
      writer.WriteValue(item.Value.ToString()); 
      writer.WriteEndObject(); 
     } 
     writer.WriteEndArray(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(List<KeyValuePair<object, object>>); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var jsonObject = JObject.Load(reader); 
     var target = Create(objectType, jsonObject); 
     serializer.Populate(jsonObject.CreateReader(), target); 
     return target; 
    } 

    private object Create(Type objectType, JObject jsonObject) 
    { 
     if (FieldExists("Key", jsonObject)) 
     { 
      return jsonObject["Key"].ToString(); 
     } 

     if (FieldExists("Value", jsonObject)) 
     { 
      return jsonObject["Value"].ToString(); 
     } 
     return null; 
    } 

    private bool FieldExists(string fieldName, JObject jsonObject) 
    { 
     return jsonObject[fieldName] != null; 
    } 
} 

मैं इस

List<KeyValuePair<string, string>> valuesList = new List<KeyValuePair<string, string>>(); 
Dictionary<string, string> valuesDict = SomeDictionaryMethod(); 

foreach(KeyValuePair<string, string> keyValue in valuesDict) 
{ 
    valuesList.Add(keyValue); 
} 

JsonSerializerSettings jsonSettings = new JsonSerializerSettings { Converters = new [] {new KeyValuePairJsonConverter()} }; 
string valuesJson = JsonConvert.SerializeObject(valuesList, jsonSettings); 
+1

कृपया'objectType == टाइपफ़ोफ़ (सूची >) को बदलने का प्रयास करें; 'toobjectType == टाइपऑफ (सूची >);' में CanConvert विधि –

+4

एक प्रश्न - आप शब्दकोश के बजाय KeyValuePairs की सूची का उपयोग क्यों कर रहे हैं? –

+1

@ सेर्गी बेरेज़ोवस्की आप सही हैं! मुझे लगता है कि गुम हो जाने के दौरान मैं गुम हो गया और जटिल चीजों पर समाप्त हुआ। धन्यवाद! – maryhadalittlelamb

उत्तर

10

आप Newtonsoft उपयोग कर सकते हैं और शब्दकोश की तरह एक WebService विधि से बोल रहा हूँ:

var dict = new Dictionary<int, string>(); 
    dict.Add(1, "one"); 
    dict.Add(2, "two"); 

    var output = Newtonsoft.Json.JsonConvert.SerializeObject(dict); 

उत्पादन है:

{"1":"one","2":"two"} 

संपादित

जानकारी के लिए @Sergey Berezovskiy के लिए धन्यवाद।

आप वर्तमान में Newtonsoft उपयोग कर रहे हैं, तो बस अपने List<KeyValuePair<object, object>>Dictionary<object,object> को बदल सकते हैं और serialize का उपयोग करें और पैकेज से विधि deserialize।

+1

वह पहले से ही न्यूटॉन्सॉफ्ट –

+0

का उपयोग कर रहा है, इसलिए उसे केवल सूची > डिक्शनरी <ऑब्जेक्ट, ऑब्जेक्ट> में बदलना है। मैं अपने anwser – OrcusZ

+1

संपादित करूँगा यही मैंने उनसे टिप्पणियों में पूछा था। KeyValuePairs की शब्दकोश को शब्दकोश में बदलना हमेशा संभव नहीं होता है। उदाहरण - आप ट्यूपल या कक्षा बनाने के विकल्प के रूप में कुंजी-मानों को पारित करने के लिए केवीपी का उपयोग कर सकते हैं। और आपके पास एक ही कुंजी के साथ कई कुंजी-मूल्य जोड़े हो सकते हैं। जो शब्दकोश के साथ सच नहीं है। –

0

तो मैं इसी तरह के मुद्दे को हल करने के लिए देशी सी # के अलावा कुछ भी नहीं उपयोग करना चाहता था और संदर्भ के लिए यह .NET 4, jquery 3.2.1 और रीढ़ की हड्डी 1.2.0 का उपयोग कर रहा था।

मेरी समस्या यह थी कि List<KeyValuePair<...>> नियंत्रक से रीढ़ की हड्डी के मॉडल में संसाधित हो जाएगा, लेकिन जब मैंने उस मॉडल को सहेजा था तो नियंत्रक सूची को बाध्य नहीं कर सका।

public class SomeModel { 
    List<KeyValuePair<int, String>> SomeList { get; set; } 
} 

[HttpGet] 
SomeControllerMethod() { 
    SomeModel someModel = new SomeModel(); 
    someModel.SomeList = GetListSortedAlphabetically(); 
    return this.Json(someModel, JsonBehavior.AllowGet); 
} 

नेटवर्क पर कब्जा:

"SomeList":[{"Key":13,"Value":"aaab"},{"Key":248,"Value":"aaac"}] 

लेकिन फिर भी इस सेट ठीक से समर्थन में इसे करने के लिए बिना किसी परिवर्तन के मॉडल को बचाने की कोशिश model.js बाध्यकारी SomeModel वस्तु एक ही है करने के लिए कारण होगा SomeList अनुरोध शरीर में पैरामीटर लेकिन सभी कुंजियों और मानों के रूप में लंबाई अशक्त थे:

[HttpPut] 
SomeControllerMethod([FromBody] SomeModel){ 
    SomeModel.SomeList; // Count = 2, all keys and values null. 
} 

केवल बातें मैं मिल सकता है कि KeyValuePair एक संरचना और नहीं किसी चीज़ है जी जिसे इस तरह से तत्काल किया जा सकता है। मैं क्या कर समाप्त हो गया निम्नलिखित है:

  • कहीं एक मॉडल आवरण जोड़े कुंजी, मूल्य फ़ील्ड हैं कि:

    public class KeyValuePairWrapper { 
        public int Key { get; set; } 
        public String Value { get; set; } 
    
        //default constructor will be required for binding, the Web.MVC binder will invoke this and set the Key and Value accordingly. 
        public KeyValuePairWrapper() { } 
    
        //a convenience method which allows you to set the values while sorting 
        public KeyValuePairWrapper(int key, String value) 
        { 
         Key = key; 
         Value = value; 
        } 
    } 
    
  • अपने बंधन वर्ग मॉडल सेट करें अपने कस्टम आवरण वस्तु स्वीकार करने के लिए।

    public class SomeModel 
    { 
        public List<KeyValuePairWrapper> KeyValuePairList{ get; set }; 
    } 
    
  • एक नियंत्रक

    [HttpGet] 
    SomeControllerMethod() { 
        SomeModel someModel = new SomeModel(); 
        someModel.KeyValuePairList = GetListSortedAlphabetically(); 
        return this.Json(someModel, JsonBehavior.AllowGet); 
    } 
    
  • बाद में कुछ करो से बाहर कुछ json डेटा प्राप्त करें, हो सकता है model.save (शून्य, ...) शुरू हो जाती है

    [HttpPut] 
    SomeControllerMethod([FromBody] SomeModel){ 
        SomeModel.KeyValuePairList ; // Count = 2, all keys and values are correct. 
    } 
    
संबंधित मुद्दे