【发布时间】:2012-04-18 22:10:59
【问题描述】:
我知道我可以使用JsonConvert.DeserializeObject<T>(string),但是,我需要查看对象的_type(可能不是第一个参数)以确定要转换到的特定类。本质上,我想做的是:
//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);
【问题讨论】:
-
我应该指出,如果可以的话,我主要是想避免两次解析 JSON。
-
您使用哪种类型的 JSON 具有类型信息? JSON 是属性值对的表示法(其中值可以是数组或其他类型,包括它自己的属性值对)。但我从未见过带有类型信息的 JSON。当您“字符串化”并反对 JSON 时,所有类型信息都会丢失!
-
@JotaBe 它是我正在为其构建客户端的公开的 RESTful API 的一部分,用于我正在处理的项目中。当您通过 JSON 公开 API 以将所有响应包装在一个对象中时,这通常是一个好主意,因此最外层的响应始终是一个对象(即使对于错误响应),并且具有该对象的某种类型信息。 . 它在处理错误和客户端级别的预期响应方面非常有帮助...
-
(来自已删除答案的评论)-在我的情况下,API 来自另一个系统,用 Python 编写。有问题的“_type”将是“error”或少数定义类型之一,例如“report_summary”或“order”。