2017-07-17 38 views
1

我已经用Json.NET实现了JSON-RPC。我转换的响应结果如下:如何在C#中动态地转换Json.NET解析的JSON结果?

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; 
} 
+0

怎么样使用'Newtonsoft.Json.Linq.JObject.Parse (字符串json)' –

+0

不知道我理解你的要求。您是否在寻找['Convert.ChangeType()'](https://msdn.microsoft.com/en-us/library/ms130977(v = vs.110).aspx)? – dbc

+0

@IswarKChettri JSON已经被解析,我已经有了一个JObject。但是也可以是Int64或null。查看更详细的示例。我可以在完全解析后转换结果,因为我需要首先响应的“id”。 – Horcrux7

回答

0

如何使用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>(); 

YourJsonClass

public class YourJsonClass 
{ 
    public string name{ get; set; } 
    public int age { get; set; } 
    public string city{ get; set; } 
} 

您可以通过obj这样访问:

string name =obj.name; 
int age=obj.age; 
string city=obj.city; 

希望它可以帮助你。

+0

这就像我的代码。如果YourJsonClass是一个Int32,一个字符串或任何其他JSON主题,它会触发一个异常。 – Horcrux7

0

您可以使用关键字“动态”而不是硬编码类型,因此它会为您重新设置类型。 请看看这个教程:

tutorial

+0

问题是解析对象的转换。动态类型不会解决运行时的类转换错误。 – Horcrux7

2

当你反序列化对象JsonRpcResult,你object result领域要么是一个复杂的对象或基本类型。

所以,如果这是一个基本类型(如Int32),result.result将包含直接的价值,而不是JToken

所以,我先检查Type是原始的或不喜欢这样的:

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. 

编辑

当你正在运行时的Type S,你不能将您的object s按原样投射到正确的Type。您必须使用dynamic关键字在其他的答案中提到过,或检查对象的类型是你想要的类型,并投它像这样:

if (type == typeof(string)) 
{ 
    string str = (string)returnedValue; 
    ... 
}