更改特定类型的JSON.NET序列化(不是我的)

时间:2012-09-18 12:00:15

标签: c# serialization json.net

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

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

我可以以某种方式注入我自己的逻辑,以便如何将此特定类型序列化/反序列化为JSON?

谢谢!

1 个答案:

答案 0 :(得分: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


或者,您也可以使用属性注册转换器 - 请参阅http://cgeers.com/2011/09/25/writing-a-custom-json-net-datetime-converter/


或者......如果案例非常简单并且您拥有源代码 - 那么如果您只想在序列化期间忽略某些属性,那么您可以使用[JsonIgnore]属性来获取所需的属性跳过。