web-dev-qa-db-fra.com

Comment convertir un tableau Json en une liste d'objets en c #

J'ai la chaîne Json comme ci-dessous 

 {
"JsonValues":{

        "id": "MyID",

         "values": {
            "value1":{
                "id": "100",
                "diaplayName": "MyValue1"
            },
            "value2":{
                "id": "200",
                "diaplayName": "MyValue2"
            }
       }
}
}

Je veux convertir la chaîne Json en dessous des classes

  class ValueSet
   {
    [JsonProperty("id")]
    public string id
    {
        get;
        set;
    }
    [JsonProperty("values")]
    public List<Value> values
    {
        get;
        set;
    }
  }

class Value
{
    public string id
    {
        get;
        set;
    }
    public string DiaplayName
    {
        get;
        set;
    }
}

Mon code de désérialisation est 

JavaScriptSerializer js = new JavaScriptSerializer();
        StreamReader sr = new StreamReader(@"ValueSetJsonString.txt");
        string jsonString = sr.ReadToEnd();
        var items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

Mais je reçois des valeurs nulles après la sérialisation, comment puis-je résoudre ce problème?

12
niknowj

Comme d'autres l'ont déjà fait remarquer, vous n'obtenez pas les résultats escomptés car votre JSON ne correspond pas à la structure de classe dans laquelle vous essayez de vous désérialiser. Vous devez soit changer votre code JSON, soit changer vos classes. Puisque d’autres ont déjà montré comment changer le JSON, je vais adopter l’approche opposée ici.

Pour correspondre au JSON que vous avez posté dans votre question, vos classes doivent être définies comme celles ci-dessous. Notez que j'ai apporté les modifications suivantes:

  1. J'ai ajouté une classe Wrapper correspondant à l'objet externe dans votre JSON.
  2. J'ai changé la propriété Values de la classe ValueSet d'un List<Value> à un Dictionary<string, Value> puisque la propriété values de votre JSON contient un objet, pas un tableau.
  3. J'ai ajouté des attributs [JsonProperty] supplémentaires pour correspondre aux noms de propriété dans vos objets JSON.

Définitions de classe:

class Wrapper
{
    [JsonProperty("JsonValues")]
    public ValueSet ValueSet { get; set; }
}

class ValueSet
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("values")]
    public Dictionary<string, Value> Values { get; set; }
}

class Value
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("diaplayName")]
    public string DisplayName { get; set; }
}

Vous devez désérialiser dans la classe Wrapper, pas la classe ValueSet. Vous pouvez alors obtenir la ValueSet à partir de la Wrapper.

var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;

Voici un programme de travail pour démontrer:

class Program
{
    static void Main(string[] args)
    {
        string jsonString = @"
        {
            ""JsonValues"": {
                ""id"": ""MyID"",
                ""values"": {
                    ""value1"": {
                        ""id"": ""100"",
                        ""diaplayName"": ""MyValue1""
                    },
                    ""value2"": {
                        ""id"": ""200"",
                        ""diaplayName"": ""MyValue2""
                    }
                }
            }
        }";

        var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;

        Console.WriteLine("id: " + valueSet.Id);
        foreach (KeyValuePair<string, Value> kvp in valueSet.Values)
        {
            Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id);
            Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName);
        }
    }
}

Et voici la sortie:

id: MyID
value1 id: 100
value1 name: MyValue1
value2 id: 200
value2 name: MyValue2
15
Brian Rogers

http://json2csharp.com/

J'ai trouvé le lien ci-dessus extrêmement utile car il corrigeait mes classes de C # en les générant à partir du JSON renvoyé.

Puis j'ai appelé:

JsonConvert.DeserializeObject<RootObject>(jsonString); 

et tout a fonctionné comme prévu.

7
bulltorious

Votre structure de données et votre JSON ne correspondent pas.

Votre JSON est ceci:

{
    "JsonValues":{
        "id": "MyID",
        ...
    }
}

Mais la structure de données à laquelle vous essayez de le sérialiser est la suivante:

class ValueSet
{
    [JsonProperty("id")]
    public string id
    {
        get;
        set;
    }
    ...
}

Vous sautez une étape: votre JSON est une classe qui a une propriété nommée JsonValues, qui a pour objet un objet de votre structure de données ValueSet.

Aussi dans votre classe, votre JSON est ceci:

"values": { ... }

Votre structure de données est la suivante:

[JsonProperty("values")]
public List<Value> values
{
    get;
    set;
}

Notez que { .. } dans JSON définit un objet, alors que [ .. ] définit un tableau. Donc, selon votre JSON, vous n'avez pas beaucoup de valeurs, mais vous avez un objet valeursone avec les propriétés value1 et value2 de type Value.

Comme le désérialiseur attend un tableau mais obtient un objet à la place, il fait la chose la moins non destructive (exception) possible: ignorer la valeur. Votre propriété values reste avec sa valeur par défaut: null.

Si vous le pouvez: Ajustez votre JSON. Ce qui suit correspond à votre structure de données et correspond très probablement à ce que vous voulez réellement:

{
    "id": "MyID",

     "values": [
         {
            "id": "100",
            "diaplayName": "MyValue1"
         }, {
            "id": "200",
            "diaplayName": "MyValue2"
         }
     ]
}
2
user2674389

Avez-vous vérifié que cette ligne fonctionne parfaitement et que votre chaîne a de la valeur?

string jsonString = sr.ReadToEnd();

si oui, essayez ce code pour la dernière ligne:

ValueSet items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

ou si vous avez un tableau de json, vous pouvez utiliser une liste comme celle-ci:

List<ValueSet> items = JsonConvert.DeserializeObject<List<ValueSet>>(jsonString);

bonne chance

1
M2sh

vous avez une chaîne jSon incomparable, si vous voulez convertir en une liste, essayez ceci

{
    "id": "MyID",

     "values": [
        {
            "id": "100",
            "diaplayName": "MyValue1",
        },
        {
            "id": "200",
            "diaplayName": "MyValue2",
        }
   ]    
}
0
Hiệp Lê