2012-03-28 14 views
5

プリミティブ型の処理時にJson.netのデフォルトの逆シリアル化動作をオーバーライドする方法はありますか?例えば、json配列[3.14,10,"test"]を逆シリアル化するときにobject[]3.14のタイプはdoubleであり、のタイプはlongです。とにかく私はこの型の決定を傍受またはオーバーライドできるので、値をdecimalintにそれぞれ逆シリアル化できますか?Json.Netでのデフォルトのプリミティブ型の処理のオーバーライド

私は基本的にいつも常にjson整数がintとして返され、floatがdecimalとして返るようにします。これにより、doubledecimalのコンバージョンを自分のコードに挿入する必要があります。

私はNewtonsoft.Json.Serialization.DefaultContractResolverを拡張し、自分でNewtonsoft.Json.JsonConverterを実装してみましたが、このようなオーバーライドを実装する方法は見つかりませんでした。私が思う

object[] variousTypes = new object[] {3.14m, 10, "test"}; 
string jsonString = JsonConvert.SerializeObject(variousTypes); 
object[] asObjectArray = JsonConvert.DeserializeObject<object[]>(jsonString); // Contains object {double}, object {long}, object {string} 

答えて

1

を再現する

サンプルコード、これはJsonTextReader.SetTokenが私のjson.net 4.5.1のリリースなので、オーバーライドで仮想としてマークされていない

public class MyReader : JsonTextReader 
{ 
    public MyReader(string s) : base(new StringReader(s)) 
    { 
    } 

    protected override void SetToken(JsonToken newToken, object value) 
    { 
     object retObj = value; 
     if (retObj is long) retObj = Convert.ChangeType(retObj, typeof(int)); 
     if (retObj is double) retObj = Convert.ChangeType(retObj, typeof(decimal)); 

     base.SetToken(newToken, retObj); 
    } 
} 


object[] variousTypes = new object[] { 3.14m, 10, "test" }; 
string jsonString = JsonConvert.SerializeObject(variousTypes); 

JsonSerializer serializer = new JsonSerializer(); 
var asObjectArray = serializer.Deserialize<object[]>(new MyReader(jsonString)); 
+0

を動作するはずです'オーバーライドに適していない方法'を投げています。何か不足していますか? –

+0

@MatthewRuston私の現在のJson.Netバージョンは '4.0.5'です。 –

+0

は最近のリリースで仮想プロパティを削除したようです。奇妙な。 –

関連する問題