2012-03-28 35 views
5

İlkel türleri ele alırken Json.net'in varsayılan serileştirme davranışını geçersiz kılmanın bir yolu var mı? Örneğin object[]3.14 bir tür json dizi [3.14,10,"test"] deserializing zaman tip double arasında olacak ve tip long olacaktır. Yine de, bu tür kararları kestirebilir veya geçersiz kılabilirim, böylece değerleri sırasıyla decimal ve int olarak kaldırabilir miyim?Json.Net'te Varsayılan İlkel Tür İşlemini Geçersiz Kılma

Temel olarak her zaman json tam sayılarının her zaman int olarak dönmesini ve decimal olarak dönmek için yüzmesini istiyorum. Bu, kodumdaki bazılarının doubledecimal dönüşümüne enjekte etmesi için beni kurtaracak.

Newtonsoft.Json.Serialization.DefaultContractResolver uzantısını genişletmeye ve kendi Newtonsoft.Json.JsonConverter numaralı uygulamamı inceledim ancak istenen bu geçersiz kılma işlemini gerçekleştirmenin herhangi bir yolunu bulamadım.

Örnek kod

bence
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} 

cevap

1

, bu çalışması gerekir çoğaltmak

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)); 
JsonTextReader.SetToken Json.NET 4.5.1 benim sürümde sanal olarak işaretlenmemiş
+0

, böylece geçersiz kılma 'geçersiz kılma için uygun bir yöntem' atıyor. Bir şey mi eksik? –

+0

@MatthewRuston Şu anki Json.Net sürümüm 4.0.5'tür. –

+0

, sanal özelliği son bir sürümde kaldırmış gibi görünüyor. Garip. –