2012-04-18 37 views
9

Tôi biết rằng tôi có thể sử dụng JsonConvert.DeserializeObject<T>(string), tuy nhiên, tôi cần nhìn vào đối tượng _type của đối tượng (có thể không phải là tham số đầu tiên) để xác định lớp cụ thể . Về cơ bản, những gì tôi muốn làm là một cái gì đó như:Làm thế nào để đúc JObject trong JSON.Net đến T

//Generic JSON processor for an API Client. 
function MyBaseType ProcessJson(string jsonText) 
{ 
    var obj = JObject.Parse(jsonText); 
    switch (obj.Property("_type").Value.ToString()) { 
    case "sometype": 
     return obj.RootValue<MyConcreteType>(); 
     //NOTE: this doesn't work... 
     // return obj.Root.Value<MyConcreteType>(); 
    ... 
    } 
} 
... 

// my usage... 
var obj = ProcessJson(jsonText); 
var instance = obj as MyConcreteType; 
if (instance == null) throw new MyBaseError(obj); 
+0

Tôi nên chỉ ra rằng chủ yếu là tôi muốn tránh phân tích cú pháp JSON hai lần nếu có thể. – Tracker1

+0

Bạn đang sử dụng kinf nào của JSON có thông tin về loại? JSON là một ký hiệu của các cặp giá trị thuộc tính (trong đó giá trị có thể là một mảng hoặc một loại khác bao gồm cặp giá trị thuộc tính của riêng nó). Nhưng tôi chưa bao giờ thấy một JSON với thông tin kiểu. Khi bạn "stringify" và đối tượng JSON tất cả các loại thông tin bị mất! – JotaBe

+0

@JotaBe, đó là một phần của API an toàn được tiếp xúc mà tôi đang xây dựng một khách hàng cho, để sử dụng trong một dự án mà tôi đang làm việc. Nó thường là một ý tưởng hay, khi bạn trưng ra một API thông qua JSON để có tất cả các câu trả lời được bao bọc trong một đối tượng, vì vậy đáp ứng ngoài cùng luôn luôn là một đối tượng (ngay cả đối với các phản hồi lỗi), và có một số loại thông tin với đối tượng đó. Nó thực sự hữu ích về xử lý lỗi so với các phản hồi mong đợi ở cấp độ khách hàng ... – Tracker1

Trả lời

24

Đầu tiên phân tích cú pháp JSON thành một JObject. Sau đó, tra cứu thuộc tính _type bằng LINQ to JSON. Sau đó, chuyển đổi tùy thuộc vào giá trị và truyền sử dụng ToObject<T>:

var o = JObject.Parse(text); 
var jsonType = (String)o["_type"]; 

switch(jsonType) { 
    case "something": return o.ToObject<Type>(); 
    ... 
} 
+0

sẽ cho phép thử vào ngày mai. – Tracker1

+0

Điều gì sẽ xảy ra nếu loại không được biết tại thời gian biên dịch? – Nuzzolilo

+3

@Nuzzolilo câu trả lời bao gồm các kịch bản được chỉ định trong câu hỏi (và làm rõ trong các ý kiến) một cách thỏa đáng, không phải một số kịch bản giả định bạn đã đến và thêm 5 tháng sau đó. Nhờ vào sự giảm cân. – yamen

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