2017-06-21 56 views
0

這是我的第一篇文章:) 我有反序列化json字符串的問題。 這是例子:c#。如何反序列化這個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 " 
     } 
    } 
} 
} 

這是代碼反序列化:

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

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

這是模型:

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


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

我沒有任何想法,從元素獲取數據。任何sugest? Thx回答!

+0

你的json字符串是錯誤的。使用http://json2csharp.com/並看看自己是否使用了錯誤的模型 – Rahul

+0

不,JSON字符串是有效的。不要忘記標記代碼以外的地方。 –

回答

0

嘗試用這個對象來反序列化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; } 
    } 
} 

而要反序列化:

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

有了您的JSON字符串,你的模型應該是這樣的:

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; } 
} 

然後:

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

注意:如果你可以改變JSON字符串的結構,你應該使用的元素的數組。

例如,如果你改變了JSON字符串結構如下:

{ 
    "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 " 
      } 
     } 
    } 
} 

您可以使用此模型:

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; } 
} 

然後:

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

用心血這個JSON字符串結構是,你可以使用靈活的元素數!

1

由於類別和元素名稱易於變化,你可能會更好將它們定義爲詞典:

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); 

演示:https://dotnetfiddle.net/h4BYOE

0

謝謝大家的回答。 我正在學習Xamarin.Forms中的編程,它不是我的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 
      } 
     } 
    } 

我覺得這就足夠了:)

主題可以關閉。