如何在C#中动态地转换Json.NET解析的JSON结果?
我已经用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;
}
如何使用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;
希望它可以帮助你。
这就像我的代码。如果YourJsonClass是一个Int32,一个字符串或任何其他JSON主题,它会触发一个异常。 – Horcrux7
当你反序列化对象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;
...
}
怎么样使用'Newtonsoft.Json.Linq.JObject.Parse (字符串json)' –
不知道我理解你的要求。您是否在寻找['Convert.ChangeType()'](https://msdn.microsoft.com/en-us/library/ms130977(v = vs.110).aspx)? – dbc
@IswarKChettri JSON已经被解析,我已经有了一个JObject。但是也可以是Int64或null。查看更详细的示例。我可以在完全解析后转换结果,因为我需要首先响应的“id”。 – Horcrux7