1
votes

Utilisation de Json.NET pour convertir un JObject en Dictionary

Tester avec JSON comme ceci:

string json = "{\"action\":\"recognition\",\"command\":\"event\",\"eventid\":[\"1108\"],\"from_ip\":\"192.168.0.49\",\"user\":\"safetymaster\"}\n";
json = json.Replace("\n", "");  

var DeserializedJson= JsonConvert.DeserializeObject<dynamic>(json);                                
Dictionary<string, string> jsonDic = JsonConvert.DeserializeObject<Dictionary<string, string>>(DeserializedJson);

exception d'arguments non valides: 'Newtonsoft.Json.JsonConvert.DeserializeObject> (chaîne)'

Voici mon code:

{\"key1\":\"value1\",\"key2\":\"value3\",\"key3\":[\"value4\"],\"key5\":\"value5\"}\n;


7 commentaires

key3 / eventid n'a pas de valeur de chaîne, mais un tableau de chaînes. Je ne vois pas ce que vous essayez d’obtenir en appelant deux fois DeserializeObject. Ainsi, il ne devrait s'agir que de var jsonDic = JsonConvert.DeserializeObject > (json); . En outre, il n'est pas nécessaire de remplacer les nouvelles lignes.


@ckuri, si vous utilisez un objet , vous devrez peut-être le convertir en type d'utilisateur et sa complexité augmente, vous pouvez soit utiliser JToken à la place.


@ er-sho Vous avez raison. J'ai supposé que la liste eventid serait désérialisée en une liste d'objets et non en un JArray, ce qui rend l'accès aux entrées de la liste difficile (c'est-à-dire différent de l'accès aux propriétés simples où il vous suffit de convertir une chaîne). Bien sûr, la meilleure solution serait de la désérialiser dans une classe appropriée avec des propriétés et des types correctement spécifiés pour une meilleure commodité et une meilleure sécurité de type.


@ckuri, si vous n'êtes pas sûr du type de propriété json, vous pouvez utiliser JToken


Lorsque Json change et évolue de manière convultée, JToken est un outil puissant. Nous ciblons uniquement les propriétés dont nous avons besoin. F.e "Toutes les sous-propriétés s'appellent Foo, peu importe où elles se trouvent sous le nœud FooBar." est simple. Json servi par un langage pas fortement typé avec une propriété de changement de forme (tableau Php, je vous regarde) Souvent besoin d'utiliser un convertisseur personnalisé ou JToken. Mais quand le Json est connu. La classe a de grands avantages. Ils peuvent tous les deux réaliser la même chose.


Mais c'est une excellente discussion sur Json, mais pouvons-nous trouver une question Json avec peu de propriétés et un tableau / liste / collection et fermer celle-ci en tant que dupe? Avant de commencer à obtenir une réponse allant de Json2Csharp à "Définition de RootObject et JsonConvert.DeserializeObject "


@Caglia Si ma réponse vous a été utile, veuillez l'accepter.


3 Réponses :


1
votes

Essayez ceci.

public class RootObject
{
    public string action { get; set; }
    public string command { get; set; }
    public List<string> eventid { get; set; }
    public string from_ip { get; set; }
    public string user { get; set; }
}

Définissez une classe en fonction de l'objet JSON.

class Program
{
    static void Main(string[] args)
    {
        try {
            string json = "{\"action\":\"recognition\",\"command\":\"event\",\"eventid\":[\"1108\"],\"from_ip\":\"192.168.0.49\",\"user\":\"safetymaster\"}\n";
            json = json.Replace("\n", "");
            RootObject m = JsonConvert.DeserializeObject<RootObject>(json);
            string ipAddress = m.from_ip;
            string eventID = m.eventid[0];

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }

    }
}


0 commentaires

0
votes

Vous pouvez simplement obtenir la valeur:

 string json = "{\"action\":\"recognition\",\"command\":\"event\",\"eventid\":[\"1108\"],\"from_ip\":\"192.168.0.49\",\"user\":\"safetymaster\"}\n";            
 var jsonData = JsonConvert.DeserializeObject<JObject>(json);
 var action = jsonData["action"].ToString();


0 commentaires

0
votes

Cela peut être fait avec un processus en 2 étapes:

  1. Dserialise comme dictionnaire
  2. Utilisez la fonctionnalité System.Linq (ToDictionary) pour convertir le résultat précédent en Dictionary

Par exemple:

var eventIdList = jsonDic2.ContainsKey("eventid")
    ? Newtonsoft.Json.JsonConvert.DeserializeObject<string[]>(jsonDic2["eventid"])
    : new string[]{};

Le résultat de ce qui précède dans jsonDic2 est un dictionnaire avec le contenu:

entrer l'image description here

Remarque: la valeur de chaîne de l'entrée de dictionnaire" eventid "est formatée comme un tableau JSON, et vous devrez donc peut-être convertir sa valeur en tableau de chaînes lorsque nécessaire:

string json = "{\"action\":\"recognition\",\"command\":\"event\",\"eventid\":[\"1108\"],\"from_ip\":\"192.168.0.49\",\"user\":\"safetymaster\"}\n"; json = json.Replace("\n", "");

Dictionary<string, object> jsonDic = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);

var jsonDic2 = jsonDic.ToDictionary(
    x => x.Key, 
    x => x.Value.ToString()
);


1 commentaires

Merci! cette solution est très utile.