在JSON.NET中将整数序列化为十六进制 [英] Serializing an integer as hexadecimal in JSON.NET

查看:314
本文介绍了在JSON.NET中将整数序列化为十六进制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

JSON.NET支持

JSON.NET supports deserializing hexadecimal numbers (e.g. 0xffff), but how about serializing?

以下方法有效,但看起来太复杂了:

The following works, but seems far too complicated:

public sealed class HexJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(uint).Equals(objectType);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteRawValue($"0x{value:x}");
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanRead => false;
}

我正在寻找与 DateFormatHandling 类似的东西,仅用于整数.

I am looking for something along the lines of DateFormatHandling, only for integers.

推荐答案

正如注释中指出的那样,JSON中不允许使用十六进制文字(与JavaScript相反).

As pointed out in the comments, hexadecimal literals are not allowed in JSON (contrary to JavaScript).

uint值转换为十六进制字符串文字,反之亦然:

Converts uint values to hexadecimal string literals and vice versa:

public sealed class HexStringJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(uint).Equals(objectType);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue($"0x{value:x}");
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var str = reader.ReadAsString();
        if (str == null || !str.StartsWith("0x"))
            throw new JsonSerializationException();
        return Convert.ToUInt32(str);
    }
}

用法示例

public sealed class CanonInfo
{
    [JsonConverter(typeof(HexStringJsonConverter))]
    public uint ModelId { get; set; }

    [JsonConverter(typeof(HexStringJsonConverter))]
    public uint FirmwareRevision { get; set; }
}

这篇关于在JSON.NET中将整数序列化为十六进制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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