2013-05-02 72 views
18

的複雜對象我有一個JSON字符串,我需要一些幫助來反序列化。C#.NET如何反序列化JSON

什麼工作對我來說..這是JSON

{ 
"response": [ 
    { 
    "loopa": "81ED1A646S894309CA1746FD6B57E5BB46EC18D1FAff", 

    "drupa": "D4492C3CCE7D6F839B2BASD2F08577F89A27B4ff", 

    "images": [ 

     { 

     "report": { 

     "nemo": "unknown" 

    }, 

     "status": "rock", 

     "id": "7e6ffe36e-8789e-4c235-87044-56378f08m30df", 

     "market": 1 

}, 

    { 

"report": { 

"nemo": "unknown" 

}, 

"status": "rock", 

"id": "e50e99df3-59563-45673-afj79e-e3f47504sb55e2", 

"market": 1 

    } 

    ] 

} 

] 

} 

我有類的例子,但我沒有使用這些類,我不介意使用一些其他類。 這些都是類:

public class Report 
{ 
    public string nemo { get; set; } 
} 

public class Image 
{ 
    public Report report { get; set; } 
    public string status { get; set; } 
    public string id { get; set; } 
    public int market { get; set; } 
} 

public class Response 
{ 
    public string loopa { get; set; } 
    public string drupa{ get; set; } 
    public Image[] images { get; set; } 
} 

public class RootObject 
{ 
    public Response[] response { get; set; } 
} 

我想提一提,我有Newtonsoft.Json已經這樣我就可以使用一些功能從那裏。

我該怎麼辦呢? 謝謝。

+0

是否有任何異常被拋出?什麼是錯誤信息?你能否發表反序列碼? – 2013-05-02 13:25:07

+0

沒有任何限制我只是沒有收到任何數據。並在快速查看中獲取:名稱'在當前上下文中不存在 – 2013-05-02 13:35:28

+1

查看答案並檢查正確答案以結束此問題。 – filipko 2013-05-05 14:20:26

回答

34

我在我的代碼中使用像這樣,它工作正常

下面

是一段代碼,你需要編寫

using System.Web.Script.Serialization; 

JavaScriptSerializer oJS = new JavaScriptSerializer(); 
RootObject oRootObject = new RootObject(); 
oRootObject = oJS.Deserialize<RootObject>(Your JSon String); 
+2

僅供參考:這是在System.Web.Extensions.dll – 2016-02-12 20:55:19

25

應該僅僅是這樣的:

var jobject = JsonConvert.DeserializeObject<RootObject>(jsonstring); 

您可以將JSON字符串粘貼到這裏:http://json2csharp.com/檢查你的類是正確的。

+0

我試過這個,但是當我進入快速瀏覽時,我只得到「名稱」在當前上下文中不存在 – 2013-05-02 13:37:10

+0

您是否根據我鏈接的網站嘗試了課程?我看到他們不同,他們使用List 而不是RootObject和Response類中的數組。不知道它是否會有所作爲。 – stevepkr84 2013-05-02 13:41:54

+0

是的,我改變了它的測試,但原來是從這個網站 – 2013-05-02 13:52:49

12

如果你用C#2010或更高版本,可以使用dynamic type

dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonstring); 

然後你就可以訪問使用點符號在動態對象的屬性和數組:

string nemo = json.response[0].images[0].report.nemo; 
+0

可能是一個好主意,但不爲我工作: **無法找到一個或多個編譯動態表達式所需的類型。你是否缺少參考** – 2015-07-06 13:11:55

+0

美麗的作品。 – batoutofhell 2016-02-10 21:28:28

0

我使用如下:

using System.Web.Script.Serialization;  

    ... 

    public static T ParseResponse<T>(string data) 
    { 
     return new JavaScriptSerializer().Deserialize<T>(data); 
    } 
2

我有一個場景,而這一次幫我

JObject objParserd = JObject .Parse(jsonString);

JObject arrayObject1 =(JObject)objParserd [「d」];

D myOutput = JsonConvert .DeserializeObject <D>(arrayObject1.ToString());

5

首先intall newtonsoft.json包使用Visual Studio的NuGet包管理器 然後添加以下代碼,

ClassName ObjectName = JsonConvert.DeserializeObject <ClassName> (jsonObject); 
0

shareInfo是類:

public class ShareInfo 
     { 
      [JsonIgnore] 
      public readonly DateTime Timestamp = DateTime.Now; 
      [JsonProperty("sharename")] 
      public string ShareName = null; 
      [JsonProperty("readystate")] 
      public string ReadyState = null; 
      [JsonProperty("created")] 
      [JsonConverter(typeof(Newtonsoft.Json.Converters.UnixDateTimeConverter))] 
      public DateTime? CreatedUtc = null; 
      [JsonProperty("title")] 
      public string Title = null; 
      [JsonProperty("getturl")] 
      public string GettUrl = null; 
      [JsonProperty("userid")] 
      public string UserId = null; 
      [JsonProperty("fullname")] 
      public string Fullname = null; 
      [JsonProperty("files")] 
      public GettFile.FileInfo[] Files = new GettFile.FileInfo[0]; 
     } 

// POST request. 
      var gett = new WebClient { Encoding = Encoding.UTF8 }; 
      gett.Headers.Add("Content-Type", "application/json"); 
      byte[] request = Encoding.UTF8.GetBytes(jsonArgument.ToString()); 
      byte[] response = gett.UploadData(baseUri.Uri, request); 

      // Response. 
      var shareInfo = JsonConvert.DeserializeObject<ShareInfo>(Encoding.UTF8.GetString(response)); 
2
public static void Main(string[] args) 
{ 
    string json = @" { 
    ""children"": [ 
      { 
     ""url"": ""foo.pdf"", 
       ""expanded"": false, 
       ""label"": ""E14288-Passive-40085-2014_09_26.pdf"", 
       ""last_modified"": ""2014-09-28T11:19:49.000Z"", 
       ""type"": 1, 
       ""size"": 60929 
      } 
     ] 
    }"; 




    var result = JsonConvert.DeserializeObject<ChildrenRootObject>(json); 
    DataTable tbl = DataTableFromObject(result.children); 
} 

public static DataTable DataTableFromObject<T>(IList<T> list) 
{ 
    DataTable tbl = new DataTable(); 
    tbl.TableName = typeof(T).Name; 

    var propertyInfos = typeof(T).GetProperties(); 
    List<string> columnNames = new List<string>(); 

    foreach (PropertyInfo propertyInfo in propertyInfos) 
    { 
     tbl.Columns.Add(propertyInfo.Name, propertyInfo.PropertyType); 
     columnNames.Add(propertyInfo.Name); 
    } 

    foreach(var item in list) 
    { 
     DataRow row = tbl.NewRow(); 
     foreach (var name in columnNames) 
     { 
      row[name] = item.GetType().GetProperty(name).GetValue(item, null); 
     } 

     tbl.Rows.Add(row); 
    } 

    return tbl; 
} 

public class Child 
{ 
    public string url { get; set; } 
    public bool expanded { get; set; } 
    public string label { get; set; } 
    public DateTime last_modified { get; set; } 
    public int type { get; set; } 
    public int size { get; set; } 
} 

public class ChildrenRootObject 
{ 
    public List<Child> children { get; set; } 
} 
+1

雖然此代碼段可能會解決問題,[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers )真的有助於提高您的帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! – kayess 2016-12-01 08:30:12

0

我解決了這個問題補充所有屬性的公共二傳手,應該反序列化。