Newtonsoft JSON Hủy quản lý


83

JSON của tôi như sau:

{"t":"1339886","a":true,"data":[],"Type":[['Ants','Biz','Tro']]}

Tôi đã tìm thấy thư viện giải mã Newtonsoft JSON.NET cho C #. Tôi đã cố gắng sử dụng nó như sau:

object JsonDe = JsonConvert.DeserializeObject(Json); 

Làm cách nào tôi có thể truy cập vào JsonDeđối tượng để lấy tất cả Dữ liệu "Loại"? Tôi đã thử nó với một vòng lặp nhưng nó không hoạt động vì đối tượng không có người điều tra.



Bạn nên xem câu trả lời cho câu hỏi này: stackoverflow.com/questions/11126242/…
Dietz

Câu trả lời:


133

Bạn có thể triển khai một lớp chứa các trường bạn có trong JSON của mình

class MyData
{
    public string t;
    public bool a;
    public object[] data;
    public string[][] type;
}

và sau đó sử dụng phiên bản chung của DeserializeObject:

MyData tmp = JsonConvert.DeserializeObject<MyData>(json);
foreach (string typeStr in tmp.type[0])
{
    // Do something with typeStr
}

Tài liệu: Serializing và Deserializing JSON


Tôi chỉ thêm một ví dụ hữu ích. Đó là một bí ẩn đối với tôi tại sao "loại" là một danh sách các danh sách (mảng mảng) - nhưng điều này phải phù hợp với chuỗi json mà bạn đã đưa ra.
Michael Banzon

1
Cảm ơn rất nhiều cho câu trả lời của bạn. Nó đã giúp tôi giải quyết vấn đề của tôi :)
Santosh Kumar patro

Tôi đã sử dụng một dàn diễn viên không thành công MyData tmp = (MyData)JsonConvert.DeserializeObject(json);. Phiên bản chung của deserialize hoạt động tốt hơn nhiều, cảm ơn. :-)
SharpC

Ok, tôi viết nó ở đây: dotnet add package Newtonsoft.Jsonusing Newtonsoft.Json;.
dani herrera

81

Một giải pháp dễ dàng hơn nhiều: Sử dụng kiểu động

Kể từ Json.NET 4.0 Release 1, có hỗ trợ động nguyên bản . Bạn không cần phải khai báo một lớp, chỉ cần sử dụng dynamic:

dynamic jsonDe = JsonConvert.DeserializeObject(json);

Tất cả các trường sẽ có sẵn:

foreach (string typeStr in jsonDe.Type[0])
{
    // Do something with typeStr
} 

string t = jsonDe.t;
bool a = jsonDe.a;
object[] data = jsonDe.data;
string[][] type = jsonDe.Type;

Với động, bạn không cần phải tạo một lớp cụ thể để lưu giữ dữ liệu của mình.


10
câu trả lời hay, cảm ơn vì đã giới thiệu tôi với dynamic:)
maialithar

2
Nó chắc chắn là dễ dàng. Nhưng nó có nhược điểm là không thể dễ dàng kiểm tra xem một thuộc tính có tồn tại hay không (bạn nên sử dụng xử lý ngoại lệ).
Jowen

2
@Jowen Để kiểm tra xem một thuộc tính có tồn tại mà không cần xử lý ngoại lệ hay không, hãy xem những câu trả lời đó
Yves M.

cảm ơn bạn rất nhiều 1 !! đơn giản nhất giải pháp ive được tìm kiếm quá lâu
Sly_TheKing

9

Theo Tài liệu Newtonsoft, bạn cũng có thể deserialize tới một đối tượng ẩn danh như sau:

var definition = new { Name = "" };

string json1 = @"{'Name':'James'}";
var customer1 = JsonConvert.DeserializeAnonymousType(json1, definition);

Console.WriteLine(customer1.Name);
// James

Bây giờ thật là thông minh! ;-) Nhưng nó trở nên vụng về khi định nghĩa không rõ ràng như ví dụ của bạn.
Sнаđошƒаӽ

Tôi không biết gì về definition, làm thế nào tôi nên sử dụng DeserializeAnonymousTypetrong trường hợp này?
Mehdi Dehghani

Đây là một ví dụ vô giá trị, vì hầu hết JSON không ở đâu gần sự đơn giản đó. Tôi muốn xem một định nghĩa gần giống với chuỗi JSON hơn với các thuộc tính lồng nhau ...
pmfith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.