2017-06-21 3 views
0

ceci est mon premier post :) J'ai un problème avec deserialize json string. c'est par exemple:C#. Comment désérialiser ce Json

{ 
"packs": { 
    "category1": { 
     "Element1": { 
      "url": "Url1", 
      "name": "File 1" 
     }, 
     "Element2": { 
      "url": "Url2", 
      "name": "File 2" 
     }, 
     "Element3": { 
      "url": "Url3", 
      "name": "File 3" 
     }, 
     "Element4": { 
      "url": "Url4", 
      "name": "File 4" 
     }, 
     "Element5": { 
      "url": "Url5", 
      "name": "File 5" 
     }, 
     "Element6": { 
      "url": "Url6", 
      "name": "File 6" 
     }, 
     "Element7": { 
      "url": "Url7", 
      "name": "File 7" 
     }, 
     "Element8": { 
      "url": "Url8", 
      "name": "File 8" 
     }, 
     "Element9": { 
      "url": "Url9", 
      "name": "File 9" 
     }, 
     "Element10": { 
      "url": "Url10", 
      "name": "File 10" 
     } 
    }, 
    "category2": { 
     "short": { 
      "url": "Url1", 
      "name": "Short " 
     }, 
     "medium": { 
      "url": "Url2", 
      "name": "Medium " 
     }, 
     "long": { 
      "url": "Url3", 
      "name": "Long " 
     } 
    } 
} 
} 

ce code est deserialize:

var json = client.GetStringAsync(string.Format(Url)); 

var jsonDeserialize = JsonConvert.DeserializeObject<Models.PacksModel>(json.Result); 

Ce modèle est:

public class PacksModel 
{ 
    public Cathegory packs { get; set; } 
} 


public class Cathegory 
{ 
    public JContainer category1 { get; set; } 
    public JContainer category2 { get; set; } 
} 

Je n'ai aucune idée d'obtenir des données de l'élément. Un sugest? Thx pour la réponse!

+0

votre chaîne JSON est erronée. utilisez http://json2csharp.com/ et voyez-vous que vous utilisez un mauvais modèle. – Rahul

+0

Non, la chaîne JSON est valide. Ne pas oublier le} en dehors du code de marquage. –

Répondre

0

Essayez avec cette objection à désérialiser votre JSON:

namespace ConsoleApp3.Domain 
{ 
    public class Element1 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Element2 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Element3 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Element4 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Element5 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Element6 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Element7 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Element8 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Element9 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Element10 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Category1 
    { 
     public Element1 Element1 { get; set; } 
     public Element2 Element2 { get; set; } 
     public Element3 Element3 { get; set; } 
     public Element4 Element4 { get; set; } 
     public Element5 Element5 { get; set; } 
     public Element6 Element6 { get; set; } 
     public Element7 Element7 { get; set; } 
     public Element8 Element8 { get; set; } 
     public Element9 Element9 { get; set; } 
     public Element10 Element10 { get; set; } 
    } 

    public class Short 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Medium 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Long 
    { 
     public string url { get; set; } 
     public string name { get; set; } 
    } 

    public class Category2 
    { 
     public Short @short { get; set; } 
     public Medium medium { get; set; } 
     public Long @long { get; set; } 
    } 

    public class Packs 
    { 
     public Category1 category1 { get; set; } 
     public Category2 category2 { get; set; } 
    } 

    public class RootObject 
    { 
     public Packs packs { get; set; } 
    } 
} 

Et pour désérialiser:

namespace ConsoleApp3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var jsonfile = File.ReadAllText("jsonfile.json"); 
      var deserializedFile = JsonConvert.DeserializeObject<Domain.RootObject>(jsonfile); 
      // Do something with your object 
     } 
    } 
} 
0

Avec votre chaîne JSON, votre modèle devrait ressembler à ceci:

public class Element1 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Element2 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Element3 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Element4 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Element5 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Element6 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Element7 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Element8 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Element9 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Element10 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Category1 
{ 
    public Element1 Element1 { get; set; } 
    public Element2 Element2 { get; set; } 
    public Element3 Element3 { get; set; } 
    public Element4 Element4 { get; set; } 
    public Element5 Element5 { get; set; } 
    public Element6 Element6 { get; set; } 
    public Element7 Element7 { get; set; } 
    public Element8 Element8 { get; set; } 
    public Element9 Element9 { get; set; } 
    public Element10 Element10 { get; set; } 
} 

public class Short 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Medium 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Long 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Category2 
{ 
    public Short @short { get; set; } 
    public Medium medium { get; set; } 
    public Long @long { get; set; } 
} 

public class Packs 
{ 
    public Category1 category1 { get; set; } 
    public Category2 category2 { get; set; } 
} 

public class PacksModel 
{ 
    public Packs packs { get; set; } 
} 

Et puis:

var json = client.GetStringAsync(string.Format(Url)); 
var jsonDeserialize = JsonConvert.DeserializeObject<Models.PacksModel>(json.Result); 

Remarque: Si vous pouvez modifier la structure de chaîne JSON, vous devez utiliser des tableaux pour les éléments.

Par exemple, si vous modifiez la structure de chaîne JSON à ceci:

{ 
    "packs": { 
     "category1": { 

      "Elements": [{ 
        "url": "Url1", 
        "name": "File 1" 
       }, 
       { 
        "url": "Url2", 
        "name": "File 2" 
       }, 
       { 
        "url": "Url3", 
        "name": "File 3" 
       }, 
       { 
        "url": "Url4", 
        "name": "File 4" 
       }, 
       { 
        "url": "Url5", 
        "name": "File 5" 
       }, 
       { 
        "url": "Url6", 
        "name": "File 6" 
       }, 
       { 
        "url": "Url7", 
        "name": "File 7" 
       }, 
       { 
        "url": "Url8", 
        "name": "File 8" 
       }, 
       { 
        "url": "Url9", 
        "name": "File 9" 
       }, 
       { 
        "url": "Url10", 
        "name": "File 10" 
       } 
      ] 
     }, 
     "category2": { 
      "short": { 
       "url": "Url1", 
       "name": "Short " 
      }, 
      "medium": { 
       "url": "Url2", 
       "name": "Medium " 
      }, 
      "long": { 
       "url": "Url3", 
       "name": "Long " 
      } 
     } 
    } 
} 

Vous pouvez utiliser ce modèle:

public class Element 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Category1 
{ 
    public List<Element> Elements { get; set; } 
} 

public class Short 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Medium 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Long 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Category2 
{ 
    public Short @short { get; set; } 
    public Medium medium { get; set; } 
    public Long @long { get; set; } 
} 

public class Packs 
{ 
    public Category1 category1 { get; set; } 
    public Category2 category2 { get; set; } 
} 

public class PacksModel 
{ 
    public Packs packs { get; set; } 
} 

Et puis:

var json = client.GetStringAsync(string.Format(Url)); 
var jsonDeserialize = JsonConvert.DeserializeObject<Models.PacksModel>(json.Result); 

L'effort avec cette structure de chaîne JSON est, que vous pouvez utiliser un nombre flexible d'éléments!

1

Puisque les noms de catégories et éléments ont tendance à varier, vous pouvez être mieux les définir comme des dictionnaires:

public class PacksModel 
{ 
    public Dictionary<string, Dictionary<string, Item>> packs { get; set; } 
} 

public class Item 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

// ...................................... 

var obj = JsonConvert.DeserializeObject<PacksModel>(json); 
Console.WriteLine(obj.packs["category2"]["medium"].url); 

Démo: https://dotnetfiddle.net/h4BYOE

0

Merci à tous pour la réponse. J'apprends la programmation dans Xamarin.Forms et ce n'est pas mon json.

HttpClient client = new HttpClient(); 
var json = client.GetStringAsync(string.Format(Url)); 
dynamic deserializeJson = JsonConvert.DeserializeObject<dynamic>(json.Result); 



private void writeDataOnModelMusicUrl() 
    { 
     foreach (var part in deserializeJson["packs"]["category1"]) 
     { 

      foreach (var elements in part) 
      { 
       var url = elements["url"]; 
       var name = elements["name"]; 
       //I'm doing something 
      } 
     } 

     foreach (var part in deserializeJson["packs"]["category2"]) 
     { 

      foreach (var elements in part) 
      { 
       var url = elements["url"]; 
       var name = elements["name"]; 
       //I'm doing something 
      } 
     } 
    } 

Je pense que ça suffit :)

Le sujet peut être fermé.