【问题标题】:How to deserialize using JSON.Net to an anonymous type?如何使用 JSON.Net 反序列化为匿名类型?
【发布时间】:2013-08-19 20:55:05
【问题描述】:

只是尝试从 JSON 创建一个匿名类型,而无需提前了解参数,并完全解释它们(可能带有提示)。即该值“看起来”像一个 int、字符串或日期。

到目前为止,我所知道的唯一方法是创建一个您预先知道的匿名类型。请参阅下面的 .DeserializeAnonymousType(...) 方法。

还有谁能做得比这更好?谢谢。

        var jsonString = "{\"user_id\": 1, \"user_type\": \"moderator\", \"name\": \"Fred\"}";

        JToken root = JObject.Parse(jsonString);

        var anonTemplate = new{user_id=0, user_type="", name="" };

        var a = JsonConvert.DeserializeAnonymousType(root.ToString(), anonTemplate);


        var b = JsonConvert.DeserializeObject<Object>(root.ToString());  // actually turns into a JsonObject which is something differet.

更新

我下载了 dynamicduck 并正在使用它。布赖恩的这个奇怪的动态“包装器”想法能以我需要的方式(可序列化等)吗?

http://weblogs.asp.net/britchie/archive/2010/08/05/json-net-dynamic-extensions.aspx

http://weblogs.asp.net/britchie/archive/2010/08/03/dynamicduck-duck-typing-in-a-dynamic-world.aspx

【问题讨论】:

  • 如果是 .NET 4,我假设您应该能够反序列化为 dynamic 对象,然后显式访问所需的属性
  • 如果您不知道该对象具有或预期具有哪些参数,您打算如何使用它?
  • @sll:有例子吗?不反对动态类型。我有时会使用它们。在这种情况下,我的下一个问题是如何将动态类型转换为匿名类型。我对任一路径都很满意,因为性能不是问题,但是,在这种情况下,我确实需要一个匿名类型(现有库)。
  • @KallDrexx:还有其他动态 DSL 的东西。
  • drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/… article 概述了如何返回 C# 动态,尽管不是使用 Json.net

标签: c# json.net


【解决方案1】:

您可以使用 ExpandoObjectConverter 将 JSON.NET 反序列化为 ExpandoObject

要在运行时创建一个匿名类型,它有点复杂,看看这个线程中跳过的箍:

How to create LINQ Expression Tree to select an anonymous type

正如您所看到的,您可能不值得付出很多努力,因为您仍然无法获得任何编译时安全性。因此,dynamic 或 ExpandoObject 是您最好的选择。

【讨论】:

  • 您有可以链接到的 ExpandoObjectConverter 用法示例吗?
猜你喜欢
  • 2011-09-19
  • 1970-01-01
  • 2020-04-06
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多