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);
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
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
@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