JSON.NET系列化麻烦 [英] JSON.NET serialization trouble

查看:133
本文介绍了JSON.NET系列化麻烦的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一类点(结构中的.NET框架)的属性类型。 我用JsonConvert从Newton.Json将其序列化到JSON。 但结果是

 点:100,100
 

相反

 点:{X:100,Y:100}
 

当我更换JsonConvert标准JavascriptSerializer, 一切工作正常。

不过,我想用JsonConverter从JSON.Net,因为它的速度更快。

解决方案

这是因为定义自己的类型转换器和JSON.NET用它做的序列化。我不知道是否有一个干净的方式来关闭该行为,但你一定可以创建自己的 JsonConverter ,其行为您想要的方式:

 类PointConverter:JsonConverter
{
    公众覆盖无效WriteJson(
        JsonWriter作家,对象的值,JsonSerializer串行)
    {
        VAR点=(点)的价值;

        serializer.Serialize(
            作家,新JObject {{X的,point.X},{Y,point.Y}});
    }

    公众覆盖对象ReadJson(
        JsonReader读者,类型的objectType,对象existingValue,
        JsonSerializer串行)
    {
        VAR jObject = serializer.Deserialize< JObject>(读卡器);

        返回新的点((双)jObject [X],(双)jObject [Y]);
    }

    公众覆盖布尔CanConvert(类型的objectType)
    {
        返回的objectType == typeof运算(点);
    }
}
 

然后就可以使用这样的:

  JsonConvert.SerializeObject(
    新{点=新的点(15,12)},
    新PointConverter())
 

I have a class with property type of Point ( struct in .NET Framework). I use JsonConvert from Newton.Json to serialize it to JSON. But result is

 "Point" : "100,100" 

Instead of

 "Point" : { X: "100", Y: "100"}

When I replace JsonConvert with standard JavascriptSerializer, all works fine.

But I want to use JsonConverter from JSON.Net, because it's much faster.

解决方案

That's because Point has defined its own TypeConverter and JSON.NET uses it to do the serialization. I'm not sure whether there is a clean way to turn this behavior off, but you can certainly create your own JsonConverter that behaves the way you want:

class PointConverter : JsonConverter
{
    public override void WriteJson(
        JsonWriter writer, object value, JsonSerializer serializer)
    {
        var point = (Point)value;

        serializer.Serialize(
            writer, new JObject { { "X", point.X }, { "Y", point.Y } });
    }

    public override object ReadJson(
        JsonReader reader, Type objectType, object existingValue,
        JsonSerializer serializer)
    {
        var jObject = serializer.Deserialize<JObject>(reader);

        return new Point((double)jObject["X"], (double)jObject["Y"]);
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Point);
    }
}

You can then use it like this:

JsonConvert.SerializeObject(
    new { Point = new Point(15, 12) },
    new PointConverter())

这篇关于JSON.NET系列化麻烦的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆