第一眼看起来它们似乎是一样的。因为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>>()
:
为什么我的第二种方式有坏数据?
EDIT ---------------------------------------------- ---------
不再是问题。
最新版本的SS修补了这个问题。现在它可以解析字典<string, string>
就好了。
答案 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)。