2012-01-13 6 views
4

私はJson.Netを使ってDictionary型の辞書をシリアライズしていました。整数やブール値を辞書に追加すると、デシリアライズ時に整数とブール値が返されました。 今度は、コードの他の部分の日付のシリアル化に関する問題のためにServiceStack.Textを使用するようにコードを変更しようとしていましたが、デシリアライズ後に文字列としてブール値を返します。 Json.Netと同じ動作をする方法はありますか?ServiceStack.Textシリアライズ辞書

ここでそれを再現するコードです:https://gist.github.com/1608951 Test_JsonNetにはパスするが、Test_ServiceStack_Text_TypeSerializerとTest_ServiceStack_Text_JsonSerializerの両方がそれは何の型情報がなぜ値を文字列として残されているプリミティブな値のタイプのために放出されていない意図的な設計上の決定だ

+0

コードサンプルを提供できますか?すなわちどの辞書が問題を引き起こしているかを示す。 – mythz

+0

問題を再現するコードで質問を更新しました –

答えて

4

に失敗。

あなたはどちらのタイプの情報を保持強く型付けされたPOCOにデシリアライズする必要があります。

public class MixType 
{ 
    public string a { get; set; } 
    public int b { get; set; } 
    public bool c{ get; set; } 
} 

var mixedMap = new Dictionary<string, object> { 
    { "a", "text" }, 
    { "b", 32 }, 
    { "c", false }, 
}; 

var json = JsonSerializer.SerializeToString(mixedMap); 
Console.WriteLine("JSON:\n" + json); 

var mixedType = json.FromJson<MixType>(); 
Assert.AreEqual("text", mixedType.a); 
Assert.AreEqual(32, mixedType.b); 
Assert.AreEqual(false, mixedType.c); 

それともDictionary<string,string>にデシリアライズし、特定の種類の中に自分自身を解析します。

または、ServiceStackの動的APIを使用して逆シリアル化します。これを行う方法の例については、ServiceStack's Dynamic JSON Test folderを参照してください。

4

あなたは今、この操作を行うことができます。

JsConfig.TryToParsePrimitiveTypeValues = true; 
などあなたがブール値としてバック、バック整数としてブール値を、あなたの整数を取得しますJSONのデシリアライザトライは種類がどうあるべきかを決定するために作る、となります

関連する問題