动态反序列化JSON到传入的任何对象。c#
问题描述:
我想要做的是反序列化JSON到一个对象在C#中。我希望能够做的是通过任何对象获取它的类型,并使用JSON.Net库将json反序列化为该特定对象。这里是代码行。动态反序列化JSON到传入的任何对象。c#
Object someObject1 = someObject;
string result = await content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<someObject1.GetType()>(result);
最后一行抛出的
operator '<' cannot be applied to operands of type 'method group'
我如何在<>无C#抱怨的数据类型的异常。我需要做些什么才能使此代码有效?我缺少什么知识?
答
JsonConvert.DeserializeObject<T>
需要编译时类型。您不能像运行时那样将其传递给类型(与声明List<T>
没什么区别)。你应该反序列化到一个通用的json对象JObject
(或dynamic),或者你应该创建一个对象的实例并用json填充它。
你可以使用静态方法PopulateObject
(当然如果你的对象的属性匹配你想要反序列化的json)。
JsonConvert.PopulateObject(result, someObject1);
答
可以忽略通用的方法和使用dynamic
:
var myObj = (dynamic)JsonConvert.DeserializeObject(result);
但是,如果对象是同一类型的不是你有一个很难的类型区分,可能打运行时错误。
答
这是填充给定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
}
}
因此,如果我传入一个Object someObject,但someObject输入someOtherObjectIMade,那么它会填充someOtherObjectIMade的字段是否正确? – 2014-09-04 18:30:07
它我只是测试了这一点。 – 2014-09-04 18:48:17