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 Serializer 中,这是一个有目的的设计决策,即不会为原始值类型发出类型信息,这就是将值保留为字符串的原因。

您要么必须反序列化为包含类型信息的强类型 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);

或者反序列化为 aDictionary<string,string>并自己解析为特定类型。

或者使用 ServiceStack 的动态 API 反序列化。有关如何执行此操作的示例,请参阅ServiceStack 的 Dynamic JSON Test 文件夹。

于 2012-01-16T21:40:15.330 回答
4

您现在可以这样做:

JsConfig.TryToParsePrimitiveTypeValues = true;

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

于 2012-11-17T19:10:50.267 回答