Reading huge integers using Json.NET

I have json with huge integers, in the order of several hundred digits. I would like to analyze them as a BouncyCastle BigInteger( https://github.com/onovotny/BouncyCastle-PCL/blob/pcl/crypto/src/math/BigInteger.cs ).

{
    "bigNumber":12093812947635091350945141034598534526723049126743245...
}

So, I applied the converter using the contract resolver in the default settings.

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()
        };

The writer works as it should, writing a (large) integer value instead of the BigInteger class with all its properties, etc. However, reading is not performed. Neither ReadJson nor CanConvert are called.

I get the following exception:

JsonReaderException: JSON integer 340597435091750914358634185762341897561435984635897436598435643875643189576413589743659817456 ... too large or small for Int64.

Json.NET ?

json, .

+4
2

, Json.Net System.Numerics.BigInteger. JsonTextReader, , . , , Org.BouncyCastle.Math.BigInteger, System.Numerics.BigInteger. (, , . - JsonTextReader, , , , - , .)

:

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
+2

, json :

public class YourModel
{
    [JsonConverter(typeof(CustomConverter<BigInteger>))]
    public BigInteger YourProperty{ get; set; }
}

, :

public class CustomConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        your code ..
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        //explicitly specify the concrete type we want to create
        return serializer.Deserialize<T>(reader);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        your code ...
    }
}
0

Source: https://habr.com/ru/post/1611248/


All Articles