我有一小段测试代码,我尝试将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
答案 0 :(得分:3)
就像@HotLicks所说,当你将对象转换为JSON时,JSON映射的关键部分将作为String返回。我不相信有任何办法可以绕过这种行为。如果预期的行为是JSON映射,我也避免使用整数作为地图中的键。相反,我会做类似的事情:
map.put("identifier", 1);
map.put("value", "sample");
它有点冗长,但也更容易看到它如何转换为JSON。
答案 1 :(得分: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;
}
};
答案 2 :(得分:0)
映射也可以存储为元组/对的数组。
{
"myMap" : [
{"key": 1, "value": 42},
{"key": 2, "value": 21},
{"key": 3, "value": 31415}
]
}