2013-05-02 38 views
18

Tôi có một chuỗi JSON và tôi cần một số trợ giúp để deserialize nó.C# .net làm thế nào để deserialize đối tượng phức tạp của JSON

gì làm việc cho tôi .. đây là 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 

    } 

    ] 

} 

] 

} 

tôi có một ví dụ về các lớp học nhưng tôi không cần phải sử dụng những lớp học, tôi không nhớ sử dụng một số lớp khác. đây là các lớp:

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

Tôi muốn đề cập rằng tôi có Newtonsoft.Json vì vậy tôi có thể sử dụng một số chức năng từ đó.

Tôi làm cách nào để thực hiện việc này? cảm ơn.

+0

Có ngoại lệ nào bị ném không? Thông báo lỗi là gì? Bạn có thể vui lòng đăng mã deserialization? –

+0

không có ngoại lệ tôi chỉ không nhận được bất kỳ dữ liệu nào.và nhận được điều này trong chế độ xem nhanh: Tên 'không tồn tại trong ngữ cảnh hiện tại –

+1

Nhìn vào các câu trả lời và kiểm tra câu trả lời đúng để đóng câu hỏi này. – filipko

Trả lời

34

Tôi đang sử dụng như thế này trong mã của mình và nó hoạt động tốt

dưới đây là một đoạn mã mà bạn cần phải viết

using System.Web.Script.Serialization; 

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

FYI: đây là trong System.Web.Extensions.dll –

25

chỉ nên là thế này:

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

Bạn có thể dán chuỗi json để ở đây: http://json2csharp.com/ để kiểm tra lớp học của bạn là chính xác.

+0

tôi đã thử điều này, nhưng tôi chỉ nhận được "Tên" không tồn tại trong ngữ cảnh hiện tại "khi vào xem nhanh –

+0

Bạn đã thử các lớp học theo trang web tôi đã liên kết chưa? Tôi thấy chúng khác nhau ở chỗ chúng sử dụng Danh sách hơn là mảng trong các lớp RootObject và Response. Không chắc chắn nếu nó sẽ tạo sự khác biệt. – stevepkr84

+0

có, tôi đã thay đổi nó để kiểm tra, nhưng bản gốc là từ trang web này –

12

Nếu bạn sử dụng C# 2010 hoặc mới hơn, bạn có thể sử dụng dynamic type:

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

Sau đó, bạn có thể truy cập các thuộc tính và mảng trong đối tượng năng động sử dụng ký hiệu dấu chấm:

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

Có thể là một ý tưởng hay nhưng không hoạt động cho tôi: ** Không thể tìm thấy một hoặc nhiều loại để biên dịch biểu thức động. Bạn có thiếu tham chiếu ** –

+0

Hoạt động hay không. – batoutofhell

0

Tôi đang sử dụng sau đây:

using System.Web.Script.Serialization;  

    ... 

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

Tôi đã có một kịch bản, và điều này đã giúp tôi

JObject objParserd = JObject .Parse (jsonString);

JObject arrayObject1 = (JObject) objParserd ["d"];

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

5

Đầu tiên gói intall newtonsoft.json để sử dụng visual studio NuGet Package Manager sau đó thêm mã sau đây,

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

shareInfo là Class:

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

Trong khi đoạn mã này có thể giải quyết câu hỏi, [bao gồm cả giải thích] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Ngoài ra, vui lòng không cố gắng gắn mã của bạn với các nhận xét giải thích, điều này làm giảm khả năng đọc của cả mã và giải thích! – kayess

0

tôi giải quyết vấn đề này để thêm một setter công cộng cho tất cả các thuộc tính, mà nên được deserialized.

Các vấn đề liên quan