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():

  • 正常に動作し、オブジェクトを正しく解析します。

2回目の試行JsonSerializer.DeserializeFromString<Dictionary<string, string>>():

  • 「employees」と「[{」のキーと値のペアを提供します。これは、実際の値の最初のフラグメントであり、残りのデータチャンクが欠落しているようです。

2 番目の方法でデータが正しくないのはなぜですか?

編集 - - - - - - - - - - - - - - - - - - - - - - - - - ------

もはや問題ではありません。

SS の最新バージョンでは、この問題にパッチが適用されています。これで Dictionary を問題なく解析できるようになり<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 に答える