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 回答
0

该映射也可以存储为元组/对的数组。

{
  "myMap" : [
    {"key": 1, "value": 42}, 
    {"key": 2, "value": 21}, 
    {"key": 3, "value": 31415}
  ]
}
于 2021-04-28T04:43:16.640 回答