Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中动态转换JSON.NET解析后的JSON结果?_C#_Json.net_Type Conversion_Json Rpc - Fatal编程技术网

如何在C#中动态转换JSON.NET解析后的JSON结果?

如何在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);

我已经用JSON.NET实现了一个JSON-RPC。我转换的响应结果为:

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,则会引发异常。问题是转换解析的对象。动态类型不会在运行时解决类强制转换错误。