【发布时间】:2017-07-17 07:39:56
【问题描述】:
我已经用 Json.NET 实现了一个 JSON-RPC。我转换的响应结果:
T data = ((JToken)value).ToObject<T>();
如果结果是一个对象,这项工作。但如果结果是 Int64 之类的原语或字符串,则它不起作用。那么这个值就不是 JToken。
我找到了方法:
static object Convert(object initialValue, CultureInfo culture, Type targetType)
这似乎可以完成所需的工作。但是 ConvertUtils 类是内部的。是否有任何公共方法可以将任何解析的 JSON 结果转换为任何目标类型?
更完整的 JSON-RPC 处理示例:
JsonRpcResult result = serializer.Deserialize<JsonRpcResult>(jsonTextReader);
Type type = requests[result.id];
object value = result.result;
return ((JToken)value).ToObject(type);
一个典型的 JSON 字符串:
{"jsonrpc":"2.0","result":DynamicValidJsonDependsOnID,"id":1}
DynamicValidJsonDependsOnID 的 JSON 内容取决于 id,可以是任何有效的 JSON。没有限制。
JsonRpcResult 类:
[JsonObject(MemberSerialization.Fields)]
internal class JsonRpcResult
{
private string jsonrpc;
private object result;
private Dictionary<String,Object> error;
private object id;
}
【问题讨论】:
-
如何使用
Newtonsoft.Json.Linq.JObject.Parse(string json) -
不确定我是否理解您的要求。你在找
Convert.ChangeType()吗? -
@IswarKChettri JSON 已经被解析,我已经有一个 JObject。但也可以是 Int64 或 null。请参阅更详细的示例。我可以在完全解析后转换结果,因为我首先需要响应的“id”。
-
@dbc 是的,我搜索了一些东西,但它还必须转换 JObject、JArray 以及 json 解析器可以返回的所有内容。
-
@Horcrux7 - 你不能只检查
if (value is JToken),如果是,使用ToObject(),但如果不是,使用Convert.ChangeType()?
标签: c# json.net type-conversion json-rpc