将JSON动态反序列化为传入的任何对象。C#

3
我想要做的是将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'

我该如何获取<>中的数据类型而不让c#发出警告。为使此代码正常工作,我需要做什么?我缺少哪些知识?

4个回答

6
JsonConvert.DeserializeObject<T>需要一个编译时的类型。你不能在运行时像在问题中想要做的那样传递类型 (与声明 List<T> 没有什么不同)。你应该将其反序列化为通用的json对象JObject(或dynamic),或者你应该创建一个对象实例并用json填充它。
如果你的对象属性与你想要反序列化的json匹配,你可以使用静态方法PopulateObject
JsonConvert.PopulateObject(result, someObject1 );

如果我传入一个对象someObject,但someObject的类型是我创建的someOtherObject,则它会填充someOtherObjectIMade的字段,对吗? - raging_subs
1
它可以,我刚刚测试过了。 - raging_subs

3

您可以忽略通用方法,直接使用dynamic

var myObj = (dynamic)JsonConvert.DeserializeObject(result);

然而,如果对象不是相同类型的,你将很难区分类型并且可能会遇到运行时错误。

1

对于遇到这个问题的任何人,较新版本的Newtonsoft JSON有一个重载函数,需要传递一个类型作为第二个参数,您可以在其中传递动态值而不需要跳过任何障碍:

var myObj = JsonConvert.DeserializeObject(string serializedObject, Type deserializedType);

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
        }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接