我试图在
Windows Phone 8.1上使用Json.NET从json获取BigInteger(System.Numerics),但是我得到了一个Newtonsoft.Json.JsonReaderException.
要重现错误,我已将代码缩减到此代码段:
string json = @"{
'BFN': 123456789012345678901234
}";
JsonTextReader jTR = new JsonTextReader(new StringReader(json));
while (jTR.Read())
{
if (jTR.Value != null)
{
System.Diagnostics.Debug.WriteLine("Token: {0}, Value: {1}", jTR.TokenType, jTR.Value);
}
else
{
System.Diagnostics.Debug.WriteLine("Token: {0}", jTR.TokenType);
}
}
运行此代码在jTR.Read()时收到以下错误:
An exception of type ‘Newtonsoft.Json.JsonReaderException’ occurred in
Newtonsoft.Json.DLL but was not handled in user codeAdditional information: JSON integer 123456789012345678901234 is too
large or small for an Int64.
据我所知,从源代码中可以看出,这个异常在JsonTextReader的2010行引发,但是我无法理解为什么它试图使用Int64而不是BigInteger.
非常感谢任何帮助或信息.
Json.NET版本:8.0.3
最佳答案 JsonTextReader的
source code有:
#if !(NET20 || NET35 || PORTABLE40 || PORTABLE)
string number = _stringReference.ToString();
if (number.Length > MaximumJavascriptIntegerCharacterLength)
{
throw JsonReaderException.Create(this, "JSON integer {0} is too large to parse.".FormatWith(CultureInfo.InvariantCulture, _stringReference.ToString()));
}
numberValue = BigIntegerParse(number, CultureInfo.InvariantCulture);
numberType = JsonToken.Integer;
#else
throw JsonReaderException.Create(this, "JSON integer {0} is too large or small for an Int64.".FormatWith(CultureInfo.InvariantCulture, _stringReference.ToString()));
#endif
请注意,那里有条件编译指令.简而言之,如果您使用的是Json.Net库的可移植版本(我假设您是Windows Phone),则不支持BigInteger.
如果您可以控制JSON的格式,请尝试引用大数字,使其成为字符串而不是裸整数.这将允许Json.Net阅读它.如果您确实需要将其解释为大数字,则可以使用第三方库从字符串中解析它并以此方式使用它.