Serialization Json.NET中一个属性的自定义序列化程序

Serialization Json.NET中一个属性的自定义序列化程序,serialization,json.net,Serialization,Json.net,更新 发现问题--从错误的类继承,需要是JsonConverter 我有一个具有System.Data.Entity.Spatial.DbGeography类型的Location属性的类。默认的Json.NET序列化程序输出Json文本,如下所示: 。。。 “PlaceType”:0, “地点”:{ “地理”:{ “协调系统ID”:4326, “WellKnownText”:“点(-88.0000044.00000)” } }, “addddt”:空, ... 我希望它能像这样输出文本: 。。

更新 发现问题--从错误的类继承,需要是JsonConverter

我有一个具有System.Data.Entity.Spatial.DbGeography类型的Location属性的类。默认的Json.NET序列化程序输出Json文本,如下所示:

。。。
“PlaceType”:0,
“地点”:{
“地理”:{
“协调系统ID”:4326,
“WellKnownText”:“点(-88.0000044.00000)”
}
},
“addddt”:空,
...
我希望它能像这样输出文本:

。。。
“PlaceType”:0,
“地点”:[-88.00000,44.00000],
“addddt”:空,
...
…所以在我看来,我应该做的是覆盖DbGeography类型上当前使用的任何转换器

到目前为止,我看到的使用CustomCreationConverter和ContractResolver的示例似乎解决了如何为正在序列化的主类替换序列化程序,而不是仅为该类属性的类型替换序列化程序。涉及注释被重写的类的示例对我来说不起作用,因为我没有在代码中定义DbGeography,它实际上是一个密封的类,因为它没有构造函数,只能由
内部
工厂方法实例化


有没有一种方法可以流畅地将JsonConverter应用于类型?如果是,转换器会是什么样子?我是否只重写WriteJson()方法?

使用属性上的
JsonConverterAttribute
并定义自定义转换器-

例如,我们有一个作为unix值(long int)输入的属性,并将其序列化为.Net
DateTime

[JsonConverter(typeof(UnixTimeJsonConverter))]
请求的公共日期时间{get;set;}

结果表明,我只需要从JsonConverter继承,而不是从CustomCreationConverter继承,并且我一直尝试更改的所有其他内容都是正常的

我仍然不确定是否有一种方法可以流畅地应用JsonConverter,但有另一种方法可以应用JsonConverter,而无需在域/核心项目中引用Json.NET,也无需使用对外围库的引用标记域类:

var jsonSerializer = new JsonSerializer();
jsonSerializer.Converters.Add(new DbGeographyConverter());
jsonSerializer.Serialize(jsonWriter, place);

可以向单个属性添加自定义序列化程序,如下所示:

公共类注释
{
公共字符串作者{get;set;}
[JsonConverter(typeof(NiceDateConverter))]
公共日期时间日期{get;set;}
公共字符串文本{get;set;}
}
公共类NiceDateConverter:JsonConverter
{
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
变量日期=(日期时间)值;
var niceLookingDate=date.ToString(“mm-dd,yyyy”在“H:mm-tt”);
writer.WriteValue(niceLookingDate);
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
抛出new NotImplementedException(“不必要,因为CanRead为false。该类型将跳过转换器。”);
}
公共覆盖布尔可读取
{
获取{return false;}
}
公共覆盖布尔CanConvert(类型objectType)
{
return objectType==typeof(DateTime);
}
}

然后,当您使用JsonConvert.SerializeObject()序列化对象时,自定义序列化程序将用于Date属性。

能否提供有关如何将其连接在一起的更多信息?我尽了最大努力打了两枪,但没有效果。我将用更多信息更新我的问题。好的,我必须等两天才能将我自己的问题标记为已回答?所以很多人会把这当作我还在等待答案来看待?试图删除整件事。最好把它放在那里——其他人可能会从你学到的东西中受益。你做了正确的事情,更新了问题,说它在过渡期内解决了。奖励:
writer.WriteRawValue
如果你需要奇怪的格式,比如将日期作为JavaScript
date
对象写入