繁体   English   中英

使用JSON.NET JsonTextReader在C#中读取BigInteger

[英]Reading BigInteger in C# with JSON.NET JsonTextReader

我试图在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()时收到以下错误:

Newtonsoft.Json.DLL中出现“Newtonsoft.Json.JsonReaderException”类型的异常,但未在用户代码中处理

附加信息:对于Int64,JSON整数123456789012345678901234太大或太小。

据我所知,从源代码中可以看出,这个异常在JsonTextReader的 2010行引发 ,但是我无法理解为什么它试图使用Int64而不是BigInteger。

非常感谢任何帮助或信息。

Json.NET版本:8.0.3

JsonTextReader源代码包含:

#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阅读它。 如果您确实需要将其解释为大数字,则可以使用第三方库从字符串中解析它并以此方式使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM