Sérialiser une Liste<KeyValuePair<string, string>> comme JSON
Je suis très nouveau avec JSON, s'il vous plaît aider!
Je suis en train de serialise un List<KeyValuePair<string, string>>
JSON
Actuellement:
[{"Key":"MyKey 1","Value":"MyValue 1"},{"Key":"MyKey 2","Value":"MyValue 2"}]
Prévu:
[{"MyKey 1":"MyValue 1"},{"MyKey 2":"MyValue 2"}]
J'ai cité quelques exemples de cette et cette.
C'est mon 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;
}
}
Je suis de l'appeler à partir d'un WebService méthode comme ceci
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);
S'il vous plaît essayer de changer objectType == typeof(List<KeyValuePair<object, object>>); objectType == typeof(List<KeyValuePair<string, string>>); dans CanConvert méthode
Une question: pourquoi êtes - vous en utilisant la liste des KeyValuePairs au lieu de Dictionnaire?
vous avez raison! Je suppose que je me suis perdu pendant googler ce qu'il faut utiliser et s'est terminé en hausse de plus de compliquer les choses. Merci!!!!
Une question: pourquoi êtes - vous en utilisant la liste des KeyValuePairs au lieu de Dictionnaire?
vous avez raison! Je suppose que je me suis perdu pendant googler ce qu'il faut utiliser et s'est terminé en hausse de plus de compliquer les choses. Merci!!!!
OriginalL'auteur maryhadalittlelamb | 2017-01-06
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser Newtonsoft et dictionnaire:
La sortie est :
Modifier
Grâce à @Sergey Berezovskiy pour l'information.
Vous utilisez actuellement Newtonsoft, donc il suffit de changer votre
List<KeyValuePair<object, object>>
àDictionary<object,object>
et l'utilisation de la sérialiser et désérialiser méthode de l'emballage.Donc il suffit de changer est une Liste<KeyValuePair<object, object>> Dictionnaire<object,object>. Je vais modifier ma réponse
C'est ce que je lui ai demandé dans les commentaires. Il n'est pas toujours possible de changer de liste de KeyValuePairs de dictionnaire. Exemple - vous pouvez utiliser KVP, pour transmettre des valeurs-clés comme alternative à un Tuple ou de la création de la classe. Et vous pouvez avoir beaucoup de paires clé-valeur, avec la même Clé. Ce qui n'est pas vrai avec un dictionnaire.
Dans sa méthode de création, il a changer si la clé existe déjà, donc je pense que nous sommes plus dans un scénario qui a besoin d'un dictionnaire, mais vous avez totalement le droit dans certains cas ce type de liste peut être utile 🙂
merci pour votre aide! J'ai supprimé la Liste des<KeyValuePair<string, string>> tout simplement Dictionnaire<string, string>, et la sérialisation de travail.
OriginalL'auteur OrcusZ
Donc je ne veux pas utiliser quoi que ce soit, mais natif c# pour résoudre un problème similaire et pour la référence c'était de l'utiliser .net 4, jquery 3.2.1 et de la colonne vertébrale 1.2.0.
Mon problèmes est que le
List<KeyValuePair<...>>
serait de processus du contrôleur dans une dorsale modèle, mais quand j'ai sauvé ce modèle, le contrôleur n'a pas pu lier Liste.capture réseau:
Mais même si cet ensemble SomeList correctement dans le support model.js en essayant de sauver le modèle sans aucune modification serait la cause de la liaison SomeModel objet pour avoir la même longueur que les paramètres dans le corps de la requête, mais toutes les clés et les valeurs sont nulles:
Les seules choses que j'ai pu trouver est que KeyValuePair est une structure et non pas quelque chose qui peut être instancié de cette manière. Ce que j'ai fait est le suivant:
Ajouter un Modèle wrapper quelque part qui contient la clé, des champs de valeur:
Configurer votre classe binding modèle d'accepter personnalisé de votre objet wrapper.
Obtenir certaines données json d'un contrôleur de
Faire quelque chose à un moment plus tard, peut-être le modèle.enregistrer(null, ...) est invoquée
OriginalL'auteur steven87vt