【问题标题】:Deserialization of Json using reflection in C#在 C# 中使用反射反序列化 Json
【发布时间】:2016-09-29 13:49:56
【问题描述】:

我想通过 Newtonsoft.Json 使用以下反射方法:

MyType object = JsonConvert.DeserializeObject<MyType>(jsonString);

这是我的方法不起作用(模糊匹配异常):

Type type = Type.GetType("MyType",false);
Type JSONCovert = typeof(JsonConvert);
MethodInfo deserializer = JSONCovert.GetMethod("DeserializeObject", new Type[] { typeof(String) });
deserializer = deserializer.MakeGenericMethod(type);
var o = deserializer.Invoke(null, new object[] { JsonString });

【问题讨论】:

  • 请提供完整的异常细节。
  • 你要什么?因为现在还不清楚你的期望是什么
  • 什么是MyTypejsonString 长什么样子?
  • 各位,给定的答案对我有用,我有很多模型,我无法为它们编写 switch case 语句,所以我决定使用反射进行反序列化。
  • 为什么不直接使用 DeserializeObject 的非泛型版本呢? object o = JsonConvert.DeserializeObject(JsonString, Type.GetType("MyType"));

标签: c# json reflection json.net deserialization


【解决方案1】:

您得到模糊匹配异常,因为JsonConvert 中有两个方法,它们与您提供的名称和参数类型相匹配。它们是:

  • public static object DeserializeObject(string value)
  • public static T DeserializeObject&lt;T&gt;(string value)

您必须更具体才能选择正确的方法。不幸的是,您将无法使用GetMethod 执行此操作 - 相反,您必须扫描方法列表并选择正确的方法。你可以这样做:

    var JSONCovert = typeof(JsonConvert);
    var parameterTypes = new[] { typeof(string) };
    var deserializer = JSONCovert.GetMethods(BindingFlags.Public | BindingFlags.Static)
        .Where(i => i.Name.Equals("DeserializeObject", StringComparison.InvariantCulture))
        .Where(i => i.IsGenericMethod)
        .Where(i => i.GetParameters().Select(a => a.ParameterType).SequenceEqual(parameterTypes))
        .Single();

编辑:我要澄清的另一件事是:请记住,您的方法将导致 o 的类型为 object。您将无法在编译时将其转换为 MyType

【讨论】:

  • 很好奇为什么有人投了反对票,因为这是一个正确的答案。如果有人评论他们认为不正确或无用的内容,那将非常有用。
  • @kiziu 因为他们渴望有一天会说,“我们应该成为版主,因为我们标记了这么多帖子......” - 你的回答对所有其他人来说都是完美的......很多地方,人们只是放弃了...您是第一个提出所有条件并过滤出特定条件的人...谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多