如何在Json.Net中使用自定义字段名称将外部类序列化为json?

时间:2014-02-19 19:21:59

标签: c# .net json json.net

我有一个外部数据合约,无法修改。 Json用于序列化这些类。我需要保存输出数据大小,所以我想将原始字段名称更改为更短的版本,即:

public ClassWithLongName
{
    public string FieldWithLongName = "field1";
    public string FieldWithEvenLongerName = "field2";
} 

应序列化为:

{"f1" = "field1", "f2" = "field2"}

为了能够正确地反序列化它,必须以某种方式提供原始名称和短名称之间的映射(我在考虑字典。 我应该使用CustomConverter或IContractResolver吗?

编辑:

有一种方法可以使用CustomContractResolver:DefaultContractResolver。我重写CreateProperty方法来交换属性名称。问题是我无法获得序列化对象类型(因此所有属性的名称都保存在一个公共映射中,而不是每种类型的单独映射)。您知道如何从DefaultContractResolver获取序列化对象类型吗?

EDIT2:

可以从ResolveContract方法获取类型(它在此处作为参数传递)。我已经实现了我需要的功能,但它存在一个巨大的问题。性能。我计算了在循环中将简单对象序列化10000次所经过的时间。对于默认序列化,它大约是150毫秒,自定义序列化大约15秒。 你知道是否有办法避免它。我认为开销是由反射引起的。但是默认的序列化器如何避免呢?我使用DefaultContractResolver作为我的CustomContractResolver的父类,所以它应该使用父类正在使用的所有机制..

2 个答案:

答案 0 :(得分:1)

使用匿名对象:

ClassWithLongName obj = new ClassWithLongName();
var anonymouse  =  new { FieldWithLongName = obj.FieldWithEvenLongerName, FieldWithEvenLongerName = obj.FieldWithEvenLongerName };

JavaScriptSerializer serializer = new JavaScriptSerializer();
var output = serializer.Serialize(anonymouse);

答案 1 :(得分:1)

如果您不想使用匿名对象,可以创建自己的对象并使用AutoMapper将外部数据协定映射到您自己的类中,然后使用JavaScriptSerializer类将其序列化