当前位置: 首页 > 知识库问答 >
问题:

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

秋阳旭
2023-03-14

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

我有一个类型为System的Location属性的类。数据实体空间的地理。默认的Json。NET serializer输出JSON文本,如下所示:

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

我想让它发出这样的文本:

  ...
  "PlaceType": 0,
  "Location": [-88.00000,44.00000],
  "AddedDT": null,
  ...

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

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

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

共有3个答案

竺国兴
2023-03-14

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

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

[JsonConverter(typeof(UnixTimeJsonConverter))]
public DateTime Requested { get; set; }
夏经武
2023-03-14

事实证明,我只需要从JsonConverter继承,而不是从CustomCreationConverter继承,而且我一直试图更改的所有其他内容都是可以的。

我仍然不确定是否有一种方法可以流畅地应用JsonConver,但是还有另一种方法可以在不引用Json的情况下应用JsonConver。NET在您的域/核心项目或标记您的域类与外围库的引用:

var jsonSerializer = new JsonSerializer();
jsonSerializer.Converters.Add(new DbGeographyConverter());
jsonSerializer.Serialize(jsonWriter, place);
方焱
2023-03-14

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

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 = (DateTime) value;
        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);
    }
}

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

 类似资料:
  • 我有以下ORM对象(简化): 每行有: 主键 插入行时的时间戳 computed_values要存储的实际JSONB数据 JSONB来存储计算数据的日期列表。 虽然我对列没有问题,但是对象不能被SQLAlchemy JSON序列化程序序列化。 我的想法是为该列重新定义对象的序列化程序行为。要做到这一点,我必须定义自己的自定义JSON序列化程序,或者使用一些现成的序列化程序,比如orjson。因为我

  • 正如标题所述,我正在尝试将自定义属性添加到我返回的序列化对象中。 让我们用以下方法来介绍一个用户: getFirstname、setFirstname 现在在序列化中,我想添加一个属性fullName: Firstname Lastname。 我的实体中有一个getter方法,如下所示: 我的序列化文件如下所示: 我试过了 和其他变体,但我似乎不能得到它的权利。 注意:是的,我已清除缓存并重试 有

  • 问题内容: 有没有一种方法/库可以让我像GSON自定义序列化程序一样自定义JSON序列化? 这是我想要得到的: 此对象: KeyValuePair(“ Age”,10)myAge 通常会像 “ myAge”:{“ Key”:“ Age”,“ Value”:10} 同时我希望它进行序列化,例如: “年龄”:10 。有任何想法吗? 问题答案: 首先,我建议使用newton json dll。 其次,您

  • 问题内容: 我的代码结构如下。 和 基本上我正在扫描网站以获取统计信息,例如标题标签,重复标题等。 我正在使用JQuery并向Web服务进行AJAX调用并检索url统计信息,而该过程正在运行以显示到目前为止收集的用户url统计信息,因为扫描大型网站需要花费大量时间。因此,每隔5秒,我就会从服务器检索统计信息。现在的问题是我需要在扫描处理完成时(而不是更新期间)最后发送所有List变量数据。现在发生

  • 问题内容: 我用来将一些对象作为JSON值返回,并且除了一个字段外,它都工作正常。有没有一种简单的方法可以在一个字段中添加内容而无需手动创建整个json模板? 问题答案: Play使用GSON构建JSON字符串。如果您的字段是一种特定的对象类型,则可以通过为该类型提供自定义的序列化来轻松完成此操作。在这里查看文档 http://sites.google.com/site/gson/gson-use

  • 我有一个字段的自定义JsonSerializer(简化代码): 由于我需要用类似的逻辑序列化大约十个其他字段,这取决于字段名,如果我可以在自定义序列化程序中获得属性名,而不是编写十个相同的序列化程序,这将对我有很大帮助。 我已经看到,在方法中,我可以使用JsonGenerator获取整个对象。getCurrentValue()(参见此答案),但我没有找到获取字段名的方法。 我用的是Jackson