2017-07-17 71 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; 
    ... 
}