ServiceStack.Text序列化字典

5
我正在使用Json.Net来序列化类型为Dictionary的字典,当我将整数或布尔值添加到字典中时,在反序列化时会得到整数和布尔值。现在我试图改变我的代码,改用ServiceStack.Text,因为其他部分代码在日期序列化方面存在问题,但是现在在反序列化后,我得到的布尔和整数都被序列化成字符串了。有没有办法像Json.Net一样保持相同的行为呢?
以下是重现此问题的代码:https://gist.github.com/1608951 Test_JsonNet测试通过,但Test_ServiceStack_Text_TypeSerializer和Test_ServiceStack_Text_JsonSerializer都失败了。

你能提供一段代码示例吗?即是哪个字典引起了问题。 - mythz
我已经更新了问题,附带能够重现问题的代码。 - Gustavo Guerra
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的Dynamic JSON Test文件夹,了解如何执行此操作的示例。

4
现在你可以这样做:
JsConfig.TryToParsePrimitiveTypeValues = true;

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接