2

乍一看,它们似乎是同一回事。因为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”和“[{”的键值对,这似乎是实际值的开始片段,其余数据块丢失。

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

编辑 - - - - - - - - - - - - - - - - - - - - - - - - - ------

不再是问题。

最新版本的 SS 已修复此问题。现在它可以<string, string>很好地解析字典了。

4

2 回答 2

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'起作用了,我个人认为这是一个逻辑错误。

于 2013-10-27T23:08:55.377 回答
1

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

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

于 2013-10-27T14:28:22.557 回答