在JSON.Net中序列化和反序列化时,如何从类型名称中省略程序集名称?

时间:2011-11-07 17:06:49

标签: json json.net

我们有一份包含所有数据合同的合同。我们正在使用JSON.net将我们的数据合同序列化为json。

JSON.Net在序列化的$ type属性中添加了类型名称和程序集名称。由于我们所有的数据合同都在同一个程序集中,并且总是在当前应用程序域中加载,因此我们应该可以省略它。

我们如何实现这一目标?

由于

2 个答案:

答案 0 :(得分:5)

您可以使用Binder中的JsonSerializerSettings媒体资源。

此博客文章(由图书馆作者撰写)介绍了以下步骤:http://james.newtonking.com/archive/2011/11/19/json-net-4-0-release-4-bug-fixes.aspx

简而言之,您创建了一个派生自SerializationBinder的自定义类,并覆盖两个方法:

  • BindToName(Type serializedType, out string assemblyName, out string typeName)
  • BindToType(string assemblyName, string typeName)

您在这些方法中放置的逻辑将使您可以直接控制类型名称在$type字段中如何转换为字符串表示形式,以及在$type给定值的运行时类型如何定位

在您的情况下,想要省略程序集名称,您可以这样做:

public override void BindToName(
    Type serializedType, out string assemblyName, out string typeName)
{
    assemblyName = null;
    typeName = serializedType.FullName;
}

public override Type BindToType(string assemblyName, string typeName)
{
    return Type.GetType(typeName);
}

答案 1 :(得分:-1)

我认为可能会使用JsonObjectAttribute

标记该课程
[DataContract]
[JsonObject("")]
public class MyContractClass { ... }

这应该覆盖它也是DataContract的事实。