gpt4 book ai didi

c# - 使用 Json.NET 读取大整数

转载 作者:太空狗 更新时间:2023-10-29 21:38:41 25 4
gpt4 key购买 nike

我有一些带有巨大整数的 json,大约有几百位。我想将它们解析为 BouncyCaSTLe 的 BigInteger ( https://github.com/onovotny/BouncyCastle-PCL/blob/pcl/crypto/src/math/BigInteger.cs )。

{
"bigNumber":12093812947635091350945141034598534526723049126743245...
}

所以我实现了一个转换器,在默认设置中使用了一个契约解析器。

internal class BigIntegerConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteRawValue(value.ToString());
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken jToken = JToken.Load(reader);
return new BigInteger(jToken.ToString());
}

public override bool CanConvert(Type objectType)
{
return (objectType == typeof(BigInteger));
}
}

public class BigIntegerContractResolver : DefaultContractResolver
{
private static readonly JsonConverter bigIntegerConverter = new BigIntegerConverter();
private static Type type = typeof(BigInteger);

protected override JsonConverter ResolveContractConverter(Type objectType)
{
if (objectType == type)
{
return bigIntegerConverter;
}
return base.ResolveContractConverter(objectType);
}
}

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
ContractResolver = new BigIntegerContractResolver()
};

编写器按其应有的方式工作,写入一个(大)整数值而不是类 BigInteger 及其所有属性等。但是,读取失败。 ReadJson 和 CanConvert 似乎都没有被调用。

我得到以下异常:

JsonReaderException:JSON 整数 340597435091750914358634185762341897561435984635897436598435643875643189576413589743659817456... 对于 Int64 来说太大或太小。

如何让 Json.NET 将此数字解析为字符串而不是整数?

理想情况下,我不想自己先解析 json 字符串来添加引号。

最佳答案

如果您的大数字未被引用,Json.Net 会将其反序列化为 System.Numerics.BigInteger。这发生在 JsonTextReader 内部,远在转换器有机会处理它之前。因此,如果您希望结果类型为 Org.BouncyCaSTLe.Math.BigInteger,则需要从 System.Numerics.BigInteger 进行转换。 (似乎有点倒退,我知道。另一种选择是创建您自己的 JsonTextReader,但这可能会比它的值(value)更麻烦 - 现有阅读器的大部分有用位在私有(private)或内部方法中,因此对其进行子类化是不切实际的。)

我能够让这个转换器工作:

class BigIntegerConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(Org.BouncyCastle.Math.BigInteger));
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
System.Numerics.BigInteger big = (System.Numerics.BigInteger)reader.Value;
return new Org.BouncyCastle.Math.BigInteger(big.ToString());
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteRawValue(value.ToString());
}
}

这是我使用的测试程序。请注意,我没有使用解析器。 JsonSerializerSettings 有一个 Converters 集合,所以我只是向其中添加了 BigIntegerConverter

class Program
{
static void Main(string[] args)
{
string json = @"
{
""bigNumber"": 12093812947635091350945141034598534526723049126743245
}";

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
Converters = new List<JsonConverter> { new BigIntegerConverter() }
};

Foo foo = JsonConvert.DeserializeObject<Foo>(json);
Console.WriteLine(foo.BigNumber.ToString());
}
}

class Foo
{
public Org.BouncyCastle.Math.BigInteger BigNumber { get; set; }
}

输出:

12093812947635091350945141034598534526723049126743245

关于c# - 使用 Json.NET 读取大整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33076200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com