![](/img/trans.png)
[英]JsonConvert.DeserializeObject throws exception when deserializing CouchBase response
[英]JsonConvert.DeserializeObject throws an exception when deserializing JSON with a hex value into an sbyte property
我有一个机器生成的类MyData
,该类具有sbyte
成员。 实际的类很长,而且可读性很差,但这是其中的一部分:
class MyData
{
private sbyte _MuxControl;
public sbyte MuxControl
{
get { return _MuxControl; }
set { __isset.MuxControl = true; this._MuxControl = value; }
}
}
相应的简化JSON如下所示:
[
{
"MuxControl": 0xAA
}
]
我试图像这样反序列化:
var deserialized = JsonConvert.DeserializeObject<List<MyData>>(JsonStr);
一些值超出了sbyte
范围,例如0xAA
。 结果,引发了异常。 例如,当我将值更改为0x1
,它可以工作。
我无法触摸MyData
的代码。 它是机器生成的。 是否有转换设置,替代或其他方法来获取这些值以正确反序列化为sbyte
?
之所以会出现异常,是因为Json.Net在sbyte
幕后使用的转换方法经过范围检查,但是这里真正需要的是未经检查的转换(或更准确地说,是更大的范围)。 您可以使用自定义JsonConverter
来处理, JsonConverter
所示:
public class SByteConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(sbyte);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Integer)
{
// Integer values come in as longs from the reader.
long val = (long)reader.Value;
// If the value fits in 8 bits, convert it to a signed byte.
if (val >= -128 && val <= 255)
{
return unchecked((sbyte)val);
}
// We got a value that can't fit in an sbyte.
throw new JsonSerializationException("Value was out of range for an sbyte: " + val);
}
// We got something we didn't expect, like a string or object.
throw new JsonSerializationException("Unexpected token type: " + reader.TokenType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// Write sbyte values out in the same format we read them.
// Note this is technically invalid JSON per the spec.
writer.WriteRawValue("0x" + ((sbyte)value).ToString("X2"));
}
}
要使用转换器, JsonConvert.DeserializeObject
其实例传递给JsonConvert.DeserializeObject
如下所示:
var deserialized = JsonConvert.DeserializeObject<List<MyData>>(JsonStr, new SByteConverter());
工作演示: https : //dotnetfiddle.net/fEW6wy
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.