5

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

これを再現するコードは次のとおりです。https : //gist.github.com/1608951 Test_JsonNetは合格ですが、Test_ServiceStack_Text_TypeSerializerとTest_ServiceStack_Text_JsonSerializerの両方が失敗します

4

2 に答える 2

5

型指定されていない動的ペイロードの場合は、ServiceStack.CommonのJSON Utilsを使用することをお勧めします。これにより、動的ペイロードを解析しながら、その型を保持できます。例:

var obj = JSON.parse(json);
if (obj is new Dictionary<string, object> jsonObj) 
{
    int b = (int)jsonObj["b"];
    bool c = (bool)jsonObj["c"];
}

ServiceStack.Text JSONシリアライザーでは、プリミティブ値の型について型情報が出力されないことが意図的な設計上の決定であるため、値は文字列として残されます。

型情報を保持する強い型付き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のDynamicJSONTestフォルダーを参照してください。

于 2012-01-16T21:40:15.330 に答える
4

これで、次のことができます。

JsConfig.TryToParsePrimitiveTypeValues = true;

これにより、JSONデシリアライザーは型を決定しようとし、整数を整数に戻し、ブール値をブール値に戻します。

于 2012-11-17T19:10:50.267 に答える