如何在C#中动态转换JSON.NET解析后的JSON结果?
我已经用JSON.NET实现了一个JSON-RPC。我转换的响应结果为:如何在C#中动态转换JSON.NET解析后的JSON结果?,c#,json.net,type-conversion,json-rpc,C#,Json.net,Type Conversion,Json Rpc,我已经用JSON.NET实现了一个JSON-RPC。我转换的响应结果为: T data = ((JToken)value).ToObject<T>(); 这似乎做了必要的工作。但是ConvertUtils类是内部的。是否有任何公共方法可以将任何解析的JSON结果转换为任何目标类型 更完整的JSON-RPC处理示例: JsonRpcResult result = serializer.Deserialize<JsonRpcResult>(jsonTextReader);
T data = ((JToken)value).ToObject<T>();
这似乎做了必要的工作。但是ConvertUtils类是内部的。是否有任何公共方法可以将任何解析的JSON结果转换为任何目标类型
更完整的JSON-RPC处理示例:
JsonRpcResult result = serializer.Deserialize<JsonRpcResult>(jsonTextReader);
Type type = requests[result.id];
object value = result.result;
return ((JToken)value).ToObject(type);
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;
}
[JsonObject(MemberSerialization.Fields)]
内部类JsonRpcResult
{
私有字符串jsonrpc;
私有客体结果;
私有字典错误;
私有对象id;
}
像这样使用Newtonsoft.Json.Jobject.Parse
怎么样
//==== Create class for your Json attributes
string jsonData= " { \"Employee":{\"name\":\"John\", \"age\":31, \"city\":\"New York\" }}";
YourJsonClass obj= new YourJsonClass();
var jObject = Newtonsoft.Json.Linq.JObject.Parse(jsonData);
obj= jObject["Employee"].ToObject<YourJsonClass>();
您可以通过如下方式通过obj
访问:
string name =obj.name;
int age=obj.age;
string city=obj.city;
JsonRpcResult result = serializer.Deserialize<JsonRpcResult>(jsonTextReader);
Type type = requests[result.id];
object value = result.result;
if (!type.IsPrimitive && type != typeof(decimal) && type != typeof(string) && type != typeof(DateTime))
return ((JToken)value).ToObject(type);
return value; //otherwise return the value as it is without parsing.
if (type == typeof(string))
{
string str = (string)returnedValue;
...
}
希望它对您有所帮助。您可以使用关键字“dynamic”而不是硬编码类型,因此它将为您解析该类型。
请看一下本教程:
反序列化
JsonRpcResult
对象时,对象结果
字段将是复杂对象或基本类型
因此,如果它是基元类型(例如,Int32
),则result.result
将包含直接值,而不是JToken
因此,我首先检查类型
是否为原始类型:
string name =obj.name;
int age=obj.age;
string city=obj.city;
JsonRpcResult result = serializer.Deserialize<JsonRpcResult>(jsonTextReader);
Type type = requests[result.id];
object value = result.result;
if (!type.IsPrimitive && type != typeof(decimal) && type != typeof(string) && type != typeof(DateTime))
return ((JToken)value).ToObject(type);
return value; //otherwise return the value as it is without parsing.
if (type == typeof(string))
{
string str = (string)returnedValue;
...
}
使用
Newtonsoft.Json.Linq.JObject.Parse(字符串Json)
我不确定是否理解您的需求。你在找吗?@IswarKChettri JSON已经被解析了,我已经有了一个作业对象。但is也可以是Int64或null。请参阅更详细的示例。我可以在完全解析后转换结果,因为我首先需要响应的“id”。@dbc是的,我搜索了一些东西,但它还必须转换JObject、JArray以及json解析器可以返回的所有内容。@Horcrux7-你不能只检查是否(值为JToken)
,如果是,使用ToObject()
,但如果不是,使用Convert.ChangeType()
?这与我的代码类似。如果您的JSONClass是Int32、字符串或任何其他JSON Prinimative,则会引发异常。问题是转换解析的对象。动态类型不会在运行时解决类强制转换错误。