Reputation: 6704
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.
Upvotes: 5
Views: 7406
Reputation: 21
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();
}
Upvotes: 2
Reputation: 6704
As pointed out in the comments, hexadecimal literals are not allowed in JSON (contrary to JavaScript).
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; }
}
Upvotes: 10