ServiceStack Json DeserializeFromString <dictionary <string,string =“”>&gt;()vs JsonObject.Parse()</dictionary <string,>

时间:2013-10-27 11:35:39

标签: c# json servicestack

第一眼看起来它们似乎是一样的。因为JsonObject : IDictionary<string, string>。但是,当我尝试反序列化以下样本数据时,我会得到不同的结果:

 var str1 = "{\"employees\": [" +
            "{ \"firstName\":\"John\" , \"lastName\":\"Doe\" }, " +
            "{ \"firstName\":\"Anna\" , \"lastName\":\"Smith\" }, " +
            "{ \"firstName\":\"Peter\" , \"lastName\":\"Jones\" }" +
            "]}";

//first try
public static JsonObject DeserializeJsonString(this string s) {
    return JsonObject.Parse(s);
}
//second try
public static T DeserializeJson<T>(this string s) where T : class {
    return JsonSerializer.DeserializeFromString<T>(s);
}

首先尝试JsonObject.Parse()

  • 正常工作并正确解析对象。

第二次尝试JsonSerializer.DeserializeFromString<Dictionary<string, string>>()

  • 给了我键值对“employees”和“[{”,它似乎是实际值的开头片段,其余的数据块丢失了。

为什么我的第二种方式有坏数据?

EDIT ---------------------------------------------- ---------

不再是问题。

最新版本的SS修补了这个问题。现在它可以解析字典<string, string>就好了。

2 个答案:

答案 0 :(得分:3)

//Source code in ServiceStack.Text -> DeserializeDictionary.cs 
//Line 89
//if type is JsonObject : Dictionary<string, string>
    var mapKey = keyValue;
    var mapValue = elementValue;
//Line 145
//if type is Dictionary<string, string>
    var mapKey = Serializer.UnescapeString(keyValue);
    var mapValue = Serializer.UnescapeString(elementValue);

这就是原因:

var a = JsonSerializer.DeserializeFromString<Dictionary<string, string>>():
//returns <"key", "[{"> incorrect value
var b = JsonSerializer.DeserializeFromString<JsonObject>();
//returns <"key","[{...}]"> correct value

JsonObject继承自Dictionary<string, string>,但它被赋予与普通Dictionary<string, string>不同的含义以进行特殊处理。对我来说'a'和'b'应该返回相同的答案,要么两者都有效,要么两者都不起作用。现在'a'被破坏而'b'有效,我个人认为这是一个逻辑错误。

答案 1 :(得分:1)

我会问自己为什么要允许第二次通话。

对于Dictionary<string, string>,我希望JSON字符串看起来像{ "key1": "val1", ...},但它是{ "key1": not a string, ...}。我希望它因为无效或意外的JSON格式而失败(或返回null)。