我试图将json反序列化为c#中的对象。我希望能够做的是传递任何对象获取它的类型,并使用JSON.Net库将json反序列化为该特定对象。这是代码行。
Object someObject1 = someObject;
string result = await content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<someObject1.GetType()>(result);
最后一行抛出
的例外 operator '<' cannot be applied to operands of type 'method group'
如何在&lt;&gt;中获取数据类型没有c#抱怨。我该怎么做才能使这段代码有效?我缺少什么知识?
答案 0 :(得分:3)
JsonConvert.DeserializeObject<T>
需要编译时类型。你不能在运行时传递一个类型,因为你想要做的事情(没有什么不同于声明List<T>
)。您应该反序列化为通用的json对象JObject
(或 dynamic ),或者您应该创建一个对象的实例并用json填充它。
您可以使用静态方法PopulateObject
(当然,如果对象的属性匹配您要反序列化的json)。
JsonConvert.PopulateObject(result, someObject1 );
答案 1 :(得分:1)
您可以忽略通用方法并使用dynamic
:
var myObj = (dynamic)JsonConvert.DeserializeObject(result);
但是,如果对象的类型不同,则很难区分类型,可能会遇到运行时错误。
答案 2 :(得分:1)
对于遇到此问题的任何人,较新版本的Newtonsoft JSON都有一个重载,该重载将类型作为第二个参数,并且您可以在其中传递动态值而不会遇到任何麻烦:
var myObj = JsonConvert.DeserializeObject(string serializedObject, Type deserializedType);
答案 3 :(得分:0)
这是给定JSON数据填充对象字段的最佳方法。
此代码作为方法属于对象本身。
public void PopulateFields(string jsonData)
{
var jsonGraph = JObject.Parse(jsonData);
foreach (var prop in this.GetType().GetProperties())
{
try
{
prop.SetValue(this, fields[prop.Name].ToObject(prop.PropertyType), null);
}
catch (Exception e)
{
// deal with the fact that the given
// json does not contain that property
}
}