Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当使用十六进制值将JSON反序列化为sbyte属性时,JsonConvert.DeserializeObject引发异常_C#_Json_Reflection_Json.net_Jsonconverter - Fatal编程技术网

C# 当使用十六进制值将JSON反序列化为sbyte属性时,JsonConvert.DeserializeObject引发异常

C# 当使用十六进制值将JSON反序列化为sbyte属性时,JsonConvert.DeserializeObject引发异常,c#,json,reflection,json.net,jsonconverter,C#,Json,Reflection,Json.net,Jsonconverter,我有一个机器生成的类MyData,它有sbyte成员。实际的类很长,可读性不强,但下面是它的一个片段: class MyData { private sbyte _MuxControl; public sbyte MuxControl { get { return _MuxControl; } set { __isset.MuxControl = true; this._MuxControl = value; } } } 相

我有一个机器生成的类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);
var deserialized = JsonConvert.DeserializeObject<List<MyData>>(JsonStr, new SByteConverter());
我正试图这样反序列化:

[ 
  { 
    "MuxControl": 0xAA
  }
]
var deserialized = JsonConvert.DeserializeObject<List<MyData>>(JsonStr);
var deserialized = JsonConvert.DeserializeObject<List<MyData>>(JsonStr, new SByteConverter());
某些值超过sbyte范围,例如0xAA。结果,抛出异常。例如,当我将该值更改为0x1时,它会工作


我无法触摸MyData的代码。这是机器生成的。是否有转换设置、重写或其他方法来将这些值正确反序列化到sbyte中?

您会遇到异常,因为Json.Net在sbyte的封面下使用的转换方法是经过范围检查的,但您真正需要的是未经检查的转换,或者更准确地说,是更大的范围。您可以通过以下自定义方式处理此问题:


工作演示:

当其中一个值超出范围时,您是否可以共享您尝试反序列化的JSON、MyData的定义以及所需的处理方法?@BrianRogers当然可以。正如我所写的,我的数据是机器生成的,所以很长而且不可读。我可以分享它的一部分:私有sbyte\u MuxControl;public sbyte MuxControl{get{return{u MuxControl;}set{u_isset.MuxControl=true;this.\u MuxControl=value;}}Json有MuxControl:0xAA,sbyte或sbyte.MinValue/sbyte.MaxValue不应该是+127吗?@ivo正常情况下,是的。但我们在这里试图解决的整个问题是,允许大于127但仍适合8位的值(例如170 0xAA)根据OP的要求转换为一个sbyte。unchecked关键字允许我们这样做而不引发异常。我选择将范围的下限保留为-128,而不是0,以防数据中碰巧有sbyte值,而不是表示为负整数的MuxControl。我想让他们仍然正常转换。啊,是的。现在它有意义了。非常感谢你澄清这一点