【问题标题】:typify a list dynamically json.net, deserialization with reflection动态典型化列表 json.net,反序列化与反射
【发布时间】:2015-05-21 15:23:02
【问题描述】:

我有一个小问题。 我应该通过 c# 中的库 json.net 反序列化一个 json。 我不明白你如何切换输入粗体列表,当然,所有使用反射,因为我正在做一个通用方法。

谁能给我点启示?或解决方案:)

public static void insertTable(String json, String table)
{     
        using (localDBService db = new localDBService())
        {
            dynamic item = Activator.CreateInstance(Type.GetType("eStartService." + table));
            item = JsonConvert.DeserializeObject(json); 

            try
            {
                var set = db.Set(item.GetType());
                set.Add(item);
                db.SaveChanges();
                log.Info("Scritto sul database dal metodo InsertTable");
            }
            catch (Exception ex)
            {
                log.Info("ERRORE DI SCRITTURA SUL DATABASE METODO : insertTable");
                throw ex;
            }
        }    
}

错误:实体类型 JArray 不是当前上下文模型的一部分。

谢谢

我的需要是能够读取 json ,在您的对象中动态反序列化,就像您现在看到的那样......以及我粘贴的那个错误。 有什么解决办法吗?

【问题讨论】:

  • 我这里有两个问题,首先Type type = serviceString.GetType(); 有什么问题,目前它总是返回字符串类型,你能不能从服务中得到你想要的类型?,第二个 json.net 已经支持反序列化匿名或动态对象,但我的问题是,当您不知道列表中包含什么内容时,您将如何使用列表,如果您可以通过使用示例来回答这两个问题,我相信我们可以提出解决方案。
  • 我将指定动态返回 json.net 的列表.. 这意味着我说的对象类型是动态的!这么清楚?
  • 我可以使用什么是可以理解的?
  • 是动态解析类型还是在运行时创建类型?
  • 为什么不能用dynamic,有什么特别的原因吗?

标签: c# json list dynamic reflection


【解决方案1】:

我们应该基于特定类型创建一个泛型类型List<>,例如

var listType = typeof (List<>).MakeGenericType(type);

这是一个将 json 值反序列化为具有自定义类型的列表的完整示例:

    public static void insertTable(String json, String table)
    {
        using (localDBService db = new localDBService())
        {
            var tableType = Type.GetType("eStartService." + table);
            var list = DeserializeList(json, tableType);

            try
            {
                var set = db.Set(tableType);

                foreach (var item in list)
                    set.Add(item);
                db.SaveChanges();
                log.Info("Scritto sul database dal metodo InsertTable");
            }
            catch (Exception ex)
            {
                log.Info("ERRORE DI SCRITTURA SUL DATABASE METODO : insertTable");
                throw ex;
            }
        }
    }


    private static IList DeserializeList( string value,Type type)
    {
        var listType = typeof (List<>).MakeGenericType(type);
        var list = JsonConvert.DeserializeObject(value, listType);
        return list as IList;
    }

【讨论】:

  • 我的问题是我不知道那个班会,我有大约 30 个项目,相当于你放的 Foo。对我来说,它希望 Foo 是动态的想法..?
  • @Developer 是的,Foo 只是一个示例,正如您在示例中看到的那样,我刚刚将 Foo 类型 传递给 DeserializeList 方法,我们可以传递任何其他类型
  • 我可以用 Foo 反射吗?或者更确切地说..我该如何处理 Foo 动态反射?也许我错过了一杯水
  • 我需要上课Foo {return something.getType (); }这可能吗?
  • 我不确定我是否正确理解了您的问题,答案中 Foo 是serviceString.GetType(); 的一个示例。如果您想从list = JsonConvert.DeserializeObject&lt;List&lt;**type**&gt;&gt;(json); 直接访问您的类型的通用列表,我应该说没有简单的方法可以做到这一点,因为您在编译时不知道类型(即使您设法根据提供的反序列化它解决方案),可能是通用约束,甚至dynamic 对象可以帮助您从反序列化类型访问一些共享属性/方法
猜你喜欢
  • 2015-11-22
  • 1970-01-01
  • 2014-02-19
  • 2011-09-18
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多