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

Kev*_*ley 25 serialization json.net

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

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

  ...
  "PlaceType": 0,
  "Location": {
    "Geography": {
      "CoordinateSystemId": 4326,
      "WellKnownText": "POINT (-88.00000 44.00000)"
    }
  },
  "AddedDT": null,
  ...
Run Code Online (Sandbox Code Playgroud)

我想要它发出这样的文字:

  ...
  "PlaceType": 0,
  "Location": [-88.00000,44.00000],
  "AddedDT": null,
  ...
Run Code Online (Sandbox Code Playgroud)

...所以在我看来,我应该做的是覆盖当前在DbGeography类型上使用的任何转换器.

到目前为止我看到的使用CustomCreationConverters和ContractResolvers的示例似乎解决了如何替换序列化的主类的序列化程序,而不是仅仅是该类属性的类型.涉及对被覆盖的类进行注释的示例对我不起作用,因为我没有在我的代码中定义DbGeography,它实际上是一个密封类,因为它没有构造函数,只能通过internal工厂方法实例化.

有没有办法将JsonConverter流畅地应用于某种类型?如果是这样,转换器会是什么样子?我只是覆盖WriteJson()方法吗?

bon*_*onh 36

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

public class Comment
{
    public string Author { get; set; }

    [JsonConverter(typeof(NiceDateConverter))]
    public DateTime Date { get; set; }

    public string Text { get; set; }
}

public class NiceDateConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var date = value as DateTime;
        var niceLookingDate = date.ToString("MMMM dd, yyyy 'at' H:mm tt");
        writer.WriteValue(niceLookingDate);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
    }

    public override bool CanRead
    {
        get { return false; }
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 奖励:`writer.WriteRawValue` 如果您需要古怪的格式,例如将日期写入 JavaScript `Date` 对象 (3认同)

小智 8

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

例如,我们有一个属性作为unix值(long int),我们将它序列化为.Net DateTime:

[JsonConverter(typeof(UnixTimeJsonConverter))]
public DateTime Requested { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 你能提供更多关于它是如何连接在一起的信息吗?我为此拍了两张最好的照片,但没有任何效果。我会用更多信息更新我的问题。 (2认同)

Kev*_*ley 5

结果我只需要继承JsonConverter而不是CustomCreationConverter,而我试图改变的其他一切都是好的.

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

var jsonSerializer = new JsonSerializer();
jsonSerializer.Converters.Add(new DbGeographyConverter());
jsonSerializer.Serialize(jsonWriter, place);
Run Code Online (Sandbox Code Playgroud)

  • 最好将其保留在外面-其他人可能会从您学到的知识中受益。您做了正确的事,更新了问题以说在此期间已解决。 (2认同)