2016-03-22 13 views
4

整数を科学表記で表現するのが楽しいと判断した別のシステムからJSONをいくつか提供しています。 JSON.NETは次の例外をスローします。JSON.NET科学記法の整数

入力文字列9.658055e + 06は有効な整数ではありません。

私はいくつかの簡単なコードを使用して、問題を再作成することができました:

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

私はこれを正しくデシリアライズするためのライブラリを取得することができますどのように任意のアイデアは?

UPDATE:すべての答えのおかげで、Int64のか、他の理由のために不可能であろう二重のが、コンバータクラスの種類を変更するレコードの仕事

あなたが stringへのシリアル化を解除する必要があります
+4

Doubleにデシリアライズし、その後に整数に変換します。 – Jens

答えて

3

二つの方法:

まず、最も容易なSystem.Int64にごValue財産の種類を変更することです。これはおそらく「うまくいく」でしょう。

しかし、それは本当にintにする必要があり、場合、あなたはこのような何か行うことができます:ここでは、System.Int64としてそれを読んだが、その後通常のintにキャストしている

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

を。したがって、intがありますが、クラスを変更して、カスタムコンバータを作成する必要があります。これは、オーバーコンプリートの可能性があります。

0

を行っていますInt64同等 -

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

あなたはdoubleに値をシリアライズし、シリアライズに隠されている別のプロパティ(同じJSONを保つために)と同等のintにアクセスすることができます。

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

値が正しく解析され、オブジェクトを再初期化すると、IntValueプロパティの[JsonIgnore]属性のおかげで、Jsonも同じままになります。あなたがこれを行うことができます

関連する問題