ServiceStack.Text序列化词典

时间:2012-01-13 10:18:54

标签: servicestack

我正在使用Json.Net来序列化Dictionary类型的字典,当我在字典中添加整数或布尔值时,反序列化时我会得到整数和布尔值。 现在我试图更改我的代码以使用ServiceStack.Text,因为代码的其他部分中存在日期序列化的问题,但现在我在反序列化后得到了整数作为字符串的布尔值。有没有办法和Json.Net有相同的行为?

以下是重现它的代码:https://gist.github.com/1608951 Test_JsonNet传递,但Test_ServiceStack_Text_TypeSerializer和Test_ServiceStack_Text_JsonSerializer都失败

2 个答案:

答案 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

答案 1 :(得分:4)

您现在可以执行此操作:

JsConfig.TryToParsePrimitiveTypeValues = true;

这将使JSON反序列化器尝试确定类型应该是什么,并且您将整数恢复为整数,将布尔值恢复为布尔值等。