2011-09-04 24 views
7

Tôi có JSON sau khi trở về từ một dịch vụ JavaJSON.NET gốc Tag và Deserialization

{"Test":{ 
    "value": 1, 
    "message": "This is a test" 
    }} 

Tôi đã sau C# lớp

class Test { 
    public int value { get; set; } 
    public String message { get; set; } 
} 

Tuy nhiên, do thẻ gốc "Test" là đã trả lại Tôi không thể trực tiếp deserialize điều này với

Test deserializedTest = JsonConvert.DeserializeObject<Test>(jsonString); 

Tôi thấy tôi phải quấn lớp Kiểm tra bên trong lớp khác lớp để làm việc này. Có cách nào dễ dàng để tránh điều này ngoài cách khác là

JToken root = JObject.Parse(jsonString); 
JToken testToken = root["Test"]; 
Test deserializedTest = JsonConvert.DeserializeObject<Test>(testToken.toString()); 

Cuối cùng tôi có câu hỏi thứ hai. Hầu hết các dịch vụ tôi gọi đều có thể trả về một đối tượng ngoại lệ. Tôi figured tôi đã đọc thẻ "root" của JSON để xác định làm thế nào để deserialize đối tượng. Làm cách nào để nhận thẻ gốc đầu tiên và/hoặc có phương thức tốt hơn, thanh lịch hơn để xử lý các ngoại lệ từ một dịch vụ không?

Cảm ơn

Trả lời

1

Nếu bạn không muốn để tạo loại trình bao bọc, bạn có thể sử dụng loại ẩn danh:

var test = 
    JsonConvert.DeserializeAnonymousType(response.Content, new { Test = new Test()}).Test; 

Nếu bạn có nhiều thuộc tính hơn, chẳng hạn như ngoại lệ, có thể tốt hơn là tạo loại trình bao bọc.

1

Đơn giản chỉ cần viết một wrapper:

public class Wrapper 
{ 
    public Test Test { get; set; } 
} 

và sau đó deserialize để wrapper này và lấy ví dụ Test qua Test tài sản:

Test deserializedTest = JsonConvert.DeserializeObject<Wrapper>(jsonString).Test; 
2

Câu trả lời thực sự là một đối tượng chứa đối tượng Test. Vì vậy, mô hình đối tượng của bạn sẽ giống nhau. Và vì phản hồi có thể chứa ngoại lệ, bạn cũng nên phản ánh điều đó:

class Response 
{ 
    public Test Test { get; set; } 
    public JObject Exception { get; set; } 
} 

Giả sử bạn không biết làm cách nào để xem Exception trông như thế nào. Nếu bạn sử dụng, hãy sử dụng loại bê tông thay vì JObject. Sau đó, bạn có thể xử lý đối tượng Response dựa trên việc Exceptionnull.

+0

Tôi nghĩ rằng điều này thực sự có thể làm việc tốt nếu tôi làm cho nó đối tượng chung chung (đối tượng thử nghiệm). Đây là một cách rất đơn giản để phân tích cú pháp một hoặc các đối tượng khác. Cảm ơn bạn – Shaun

2

Đã cùng một vấn đề và thực sự muốn thoát khỏi điều này 'container', tìm thấy giải pháp này mặc dù bạn cần phải sử dụng một chuỗi thêm để tìm ra đối tượng gốc:

// Container I wanted to discard 
public class TrackProfileResponse 
{ 
    [JsonProperty("response")] 
    public Response Response { get; set; } 
} 

// Code for discarding it 
var jObject = JObject.Parse(s); 
var jToken = jObject["response"]; 
var response = jToken.ToObject<Response>();