Serializing an integer as hexadecimal in JSON.NET

不羁岁月 提交于 2020-08-26 02:55:50

问题


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;
}

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


回答1:


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

Converter

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);
    }
}

Usage example

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

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



回答2:


The below code should work for serialization in your HexJsonConverter class

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
     if(reader.ValueType.FullName == typeof(string).FullName)
    {
        string str = (string)reader.Value;
        if (str == null || !str.StartsWith("0x"))
            throw new JsonSerializationException();
        return Convert.ToUInt32(str.Substring("0x".Length), 16);
    }
    else
        throw new JsonSerializationException();
}


来源:https://stackoverflow.com/questions/43481456/serializing-an-integer-as-hexadecimal-in-json-net

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!