3

我正在使用 Newtonsoft 的 JSON.NET 库来序列化一些对象。特别是,我想将 NetTopologySuitePoint类(或 GeoAPIIPoint接口)存储为我的对象的属性。

我只想在生成的 JSON 中存储一个latitudeandlongitude属性。相比之下,IPoint 具有XYZ和其他几个属性。

我可以以某种方式注入我自己的逻辑来将这种特定类型序列化/反序列化到/从 JSON 吗?

谢谢!

4

1 回答 1

7

对于这种操作,我总是查看 TweetSharp 以及它是如何处理它的。

例如,TweetSharp 使用 TwitterGeoConverter.cs 将 TwitterGeoLocation.GeoCoordinates 类型序列化/反序列化到 JSON: https ://github.com/danielcrenna/tweetsharp/blob/master/src/net40/TweetSharp.Next/Serialization/Converters /TwitterGeoConverter.cs

该转换器中的关键方法是:

  • CanConvert - 是否应该在此成员上使用此转换器
  • WriteJson - 处理对象到字符串输出
  • ReadJson - 处理字符串到对象解析

转换器本身使用 JsonSerializerSettings 向 JSON.Net 注册 - 例如:

new JsonSerializerSettings
                   {
                       MissingMemberHandling = MissingMemberHandling.Ignore,
                       NullValueHandling = NullValueHandling.Ignore,
                       DefaultValueHandling = DefaultValueHandling.Include,
                       ContractResolver = new JsonConventionResolver(),
                       Converters = new List<JsonConverter>
                                        {
                                            new TwitterDateTimeConverter(),
                                            new TwitterWonkyBooleanConverter(),
                                            new TwitterGeoConverter()
                                        }
                   })

(来自https://github.com/danielcrenna/tweetsharp/blob/master/src/net40/TweetSharp.Next/Serialization/SerializerBase.cs


或者,您也可以使用属性注册转换器 - 请参阅https://github.com/geersch/JsonNetDateTimeConverter


或者......如果情况非常简单并且您拥有源代码 - 那么如果您只是想在序列化过程中忽略某些属性,那么有一个[JsonIgnore]属性可用于您想要跳过的属性。

于 2012-09-18T12:44:42.203 回答