2016-10-26 1 views
1

Ich habe dieses einfache Modell in einer ASP.NET WebAPI 2 Anwendung:Serialisieren Dictionary <string, string>, um Array von "name": "Wert"

public class Model { 
    public int ID { get; set; } 
    public Dictionary<string, string> Dic { get; set; } 
} 

Wenn es serialisiert wird, wobei der Ausgang ist:

{ 
    "ID": 0, 
    "Dic": { 
     "name1": "value1", 
     "name2": "value2" 
    } 
} 

suchte ich das Problem, aber es scheint die meisten Menschen diese Serialisierung benötigen:

{ 
    "ID": 0, 
    "Dic": [{ 
     "Key": "name1", 
     "Value": "value1" 
    }] 
} 

Und alle Lösungen da draußen lösen diese Art der Serialisierung. Aber was ich suche ist das Wörterbuch in dieses Format zu serialisieren:

{ 
    "ID": 0, 
    "Dic": [{ 
     "name1": "value1" 
    }, { 
     "name2": "value2" 
    }] 
} 

Mit anderen Worten, ich möchte es in ein Array von Objekten jede enthält ein "name1": "value1" Paar serialisiert. Gibt es eine Möglichkeit, das zu tun? Oder sollte ich nach einem anderen Typ suchen?

+1

Array in JSON kann keinen Schlüssel haben. Sie sollten stattdessen Objekt (Hash) verwenden. –

+1

Sorry, dein JSON ist nicht gültig. Sie können es auf jedem Online-JSON-Validator überprüfen – DmitryBLR

+0

Siehe das Update bitte –

Antwort

1

Sie können eine benutzerdefinierte JsonConverter verwenden, um die JSON zu erhalten, die Sie suchen. Hier ist der Code, den Sie für den Konverter benötigen würde:

public class CustomDictionaryConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return typeof(IDictionary).IsAssignableFrom(objectType); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     IDictionary dict = (IDictionary)value; 
     JArray array = new JArray(); 
     foreach (DictionaryEntry kvp in dict) 
     { 
      JObject obj = new JObject(); 
      obj.Add(kvp.Key.ToString(), kvp.Value != null ? JToken.FromObject(kvp.Value, serializer) : new JValue((string)null)); 
      array.Add(obj); 
     } 
     array.WriteTo(writer); 
    } 

    public override bool CanRead 
    { 
     get { return false; } 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

den Konverter zu verwenden, markieren Sie das Wörterbuch in Ihrer Modellklasse mit einem [JsonConverter] Attribut wie folgt aus:

public class Model 
{ 
    public int ID { get; set; } 
    [JsonConverter(typeof(CustomDictionaryConverter))] 
    public Dictionary<string, string> Dic { get; set; } 
} 

Demo Geige: https://dotnetfiddle.net/320LmU

Verwandte Themen