4

Map を JSON 文字列に変換して戻すテスト コードの小さなサンプルがあります。JSON 文字列からの解析中に、結果のマップに整数キー「1」ではなく文字列キー「1」が含まれるため、テストが失敗します。このマップのキーとして使用される POJO でも同じことが起こります。この動作は予期されたものですか? それとも、JSON コンバーターの構成を省略したのでしょうか?

public class SampleConverterTest {

   @Test
   public void testIntegerKey() {

      // Register an Integer converter
      JSON.registerConvertor(Integer.class, new JSONPojoConvertor(Integer.class));

      Map<Integer, String> map = new HashMap<Integer, String>();
      map.put(1, "sample");
      // Convert to JSON
      String msg = JSON.toString(map);
      // Retrieve original map from JSON
      @SuppressWarnings("unchecked")
      Map<Integer, String> obj = (Map<Integer, String>) JSON.parse(msg);

      assertTrue(obj.containsKey(1));
   }
}

jetty-util 7.6.10.v20130312 を使用しています

4

3 に答える 3

5

@HotLicks が言ったように、オブジェクトを JSON に変換すると、JSON マップのキー部分が文字列として返されます。この振る舞いを回避する方法はないと思います。また、意図した動作が JSON マップである場合は、マップ内のキーとして整数を使用することも避けます。代わりに、次のようにします。

map.put("identifier", 1);
map.put("value", "sample");

これは少し冗長ですが、JSON に変換する方法を簡単に確認できます。

于 2013-11-07T16:07:17.300 に答える
0

map<int,int>うまくマッチングしていないようです。次のように、派生クラスを使用することができます。

struct Int_int_map : map<int, int> {

    inline friend void to_json(json &j, Int_int_map const &m) {
        j = json();
        for (auto &key_val : m)
            j[to_string(key_val.first)] = key_val.second;
    }

    inline friend void from_json(const json &j, Int_int_map &m) {
        for (auto &key_val : j.get<json::object_t>()) 
            m[std::stoi(key_val.first)] = key_val.second;       
    }
};
于 2020-08-31T01:05:24.207 に答える