【问题标题】:How to cast JObject in JSON.Net to T如何将 JSON.Net 中的 JObject 转换为 T
【发布时间】: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”。

标签: c# json casting json.net


【解决方案1】:

首先将 JSON 解析为 JObject。然后使用 LINQ to JSON 查找 _type 属性。然后根据值切换并使用ToObject&lt;T&gt;进行转换:

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

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

【讨论】:

  • 明天试试这个。
  • @Nuzzolilo 答案令人满意地涵盖了问题中指定的场景(并在 cmets 中澄清),而不是您在 5 个月后添加的假设场景。感谢您的光临。
  • var jsonType = (String)o["_type"]; 对我来说总是null
  • @JamesPoulose 您必须在序列化/生成 JSON 时设置它。 :-)
【解决方案2】:

JSON.NET 无法直接支持这两个要求:

  • 包含类型名称的属性的自定义名称
  • 在对象的任意位置查找属性

JsonSubTypes 满足了第一个条件 第二个通过指定 thh right MetadataPropertyHandling

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多