2016-03-22 9 views
4

Wir werden von einem anderen System mit JSON versorgt, das entschieden hat, dass es Spaß macht, ganze Zahlen in wissenschaftlicher Notation darzustellen. Wie es steht, löst JSON.NET eine Ausnahme aus:JSON.NET Integer in der wissenschaftlichen Notation

Eingabezeichenfolge 9.658055e + 06 ist keine gültige Ganzzahl.

ich in der Lage gewesen, das Problem mit einigen einfachen Code zu erstellen:

public class TestClass 
{ 
    public int Value { get; set; } 
} 

static void Main(string[] args) 
{ 
    var json = "{Value:9.658055e+06}"; 

    var xx = JsonConvert.DeserializeObject<TestClass>(json); 
} 

Irgendwelche Ideen, wie ich die Bibliothek dies korrekt Deserialisieren bekommen kann?

UPDATE: Danke für alle Antworten, für die Aufzeichnung den Typ Int64 ändern oder Doppel würde aus anderen Gründen nicht möglich sein, aber der Konverter-Klasse hat die Arbeit erledigt

+4

Deserialisieren Sie es zu Double und konvertieren Sie es anschließend in eine ganze Zahl. – Jens

Antwort

3

zwei Möglichkeiten, wie Sie dies tun können:

erste und einfachste ist die Art Ihrer Value Eigenschaft System.Int64 zu ändern. Dies würde höchstwahrscheinlich "einfach funktionieren".

Wenn es aber wirklich braucht ein int zu sein, Sie so etwas tun könnte:

public class TestClass 
{ 
    [JsonConverter(typeof(JsonScientificConverter))] 
    public int Value { get; set; } 
} 

static void Main(string[] args) 
{ 
    var json = "{Value:9.658055e+06}"; 

    var xx = JsonConvert.DeserializeObject<TestClass>(json); 
} 

public class JsonScientificConverter : JsonConverter 
{ 
    public override bool CanRead { get { return true; } } 
    public override bool CanConvert(Type objectType) 
    { 
     return true; 
    } 

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     return (int)(serializer.Deserialize<System.Int64>(reader)); 
    } 
} 

Hier sind Sie es als System.Int64 zu lesen, aber dann ist es zu einem regelmäßigen int Gießen. Sie haben also eine int, aber Sie müssen die Klasse ändern und einen benutzerdefinierten Konverter schreiben, der die Dinge möglicherweise überkompliziert.

0

Sie die string deserialisieren benötigen, um Int64 Äquivalent -

var parsed = JsonConvert.DeserializeObject<Int64>("9.658055e+06"); //9658055 
0

Sie den Wert auf double Serialisierung kann, und Zugriff auf die int gleichwertig mit einer anderen Eigenschaft, die zur Serialisierung verborgen ist (um die json zu halten gleich):

public class TestClass 
{ 
    public double Value 
    { 
     get { return (double)IntValue; } 
     set { _IntValue = (int)value; } 
    } 

    private int _IntValue; 
    [JsonIgnore] 
    public int IntValue { 
     get { return _IntValue; } 
     set { _IntValue = value; } 
    } 

} 

static void Main(string[] args) 
{ 
    var json = "{Value:9.658055e+06}"; 

    var xx = JsonConvert.DeserializeObject<TestClass>(json); 

    Console.WriteLine(JsonConvert.SerializeObject(xx)); 
    Console.WriteLine(xx.IntValue); 
    Console.ReadKey(); 
} 

Wie Sie sehen, wird der Wert korrekt analysiert, und wenn Sie das Objekt reserialisieren, bleibt der Json gleich, dank des [JsonIgnore] Attributs auf der IntValue Eigenschaft.

Verwandte Themen