我需要帮助在JSP中创建多维HashMap或Hashtable。 为什么我需要HashMap或HashTable? 因为我最终想将一个 JSON 对象传回给客户端。 如果有另一种方法可以最终到达 JSON 对象,我会全力以赴。
我还想提一下,这个线程非常宝贵,我一直在扩展它:
如何在 JSP 中编写多维 JSON 对象并将 JSON 对象传递回 JavaScript?
以下是我希望结果的样子:
{
"results": [ {
"address_components": [ {
"long_name": "1600",
"short_name": "1600"
}, {
"long_name": "Amphitheatre Pkwy",
"short_name": "Amphitheatre Pkwy"
}, {
"long_name": "Mountain View",
"short_name": "Mountain View"
}, {
"long_name": "California",
"short_name": "CA"
}, {
"long_name": "United States",
"short_name": "US"
}, {
"long_name": "94043",
"short_name": "94043"
} ]
} ]
}
这是我的JSP代码,它使用了一个微不足道的例子,而不是像上面这样的真实数据:
Hashtable results_hash = new Hashtable();
Hashtable numbers = new Hashtable();
Hashtable[] arr = new Hashtable[10];
for (int i=0; i < 10; i++)
{
numbers.put("Number",i);
numbers.put("Numberx2",i*2);
arr[i] = new Hashtable();
arr[i].put("Comp",numbers);
results_hash.put("results",arr[i]);
}
com.google.gson.Gson gson = new com.google.gson.Gson();
String json = gson.toJson(results_hash);
out.print(json);
但是 JSON 对象看起来像这样:
{
"results": {
"Comp": {
"Numberx2":18,
"Number":9
}
}
}
这不是期望的结果。 它只获取最后一个结果并将其转换为 JSON。 因此,问题始于未正确构建多维哈希。 不过,我不确定问题出在哪里。 我将不胜感激。 谢谢。
在 JSON 中,{}
可映射为 Java Map
,[]
可映射为 Java List
。
因此,要实现以下 JSON 格式,
{
"results": [ {
"address_components": [ {
"long_name": "1600",
"short_name": "1600"
}, {
"long_name": "Amphitheatre Pkwy",
"short_name": "Amphitheatre Pkwy"
}, {
"long_name": "Mountain View",
"short_name": "Mountain View"
}, {
"long_name": "California",
"short_name": "CA"
}, {
"long_name": "United States",
"short_name": "US"
}, {
"long_name": "94043",
"short_name": "94043"
} ]
} ]
}
你需要一个(深呼吸)Map<String, List<Map<String, List<Map<String, String>>>>>
.
List<Map<String, String>> addressComponents = new ArrayList<Map<String, String>>();
Map<String, String> addressComponent1 = new HashMap<String, String>();
addressComponent1.put("long_name", "1600");
addressComponent1.put("short_name", "1600");
addressComponents.add(addressComponent1);
Map<String, String> addressComponent2 = new HashMap<String, String>();
addressComponent2.put("long_name", "Amphitheatre Pkwy");
addressComponent2.put("short_name", "Amphitheatre Pkwy");
addressComponents.add(addressComponent2);
// ...
List<Map<String, List<Map<String, String>>>> results = new ArrayList<Map<String, List<Map<String, String>>>>();
Map<String, List<Map<String, String>>> result1 = new HashMap<String, List<Map<String,String>>>();
result1.put("address_components", addressComponents);
results.add(result1);
// ...
Map<String, List<Map<String, List<Map<String, String>>>>> god = new HashMap<String, List<Map<String,List<Map<String,String>>>>>();
god.put("results", results);
String json = new Gson().toJson(god);
System.out.println(json); // There!
更好的是只使用完整的Javabean而不是Map<String, String>
。
试试这个
for (int i=0; i < 10; i++)
{
numbers.put("Number",i);
numbers.put("Numberx2",i*2);
arr[i] = new Hashtable();
arr[i].put("Comp",numbers);
}
results_hash.put("results",arr);
行
results_hash.put("results",arr[i]);
将用哈希表中的相同键覆盖最后一个条目。您只需将条目替换为键"结果",而不是添加到其中。
尝试类似(伪代码)的内容:
Map<String,String> entry;
Map<String, Map> results = new HashMap<String, Map>();
Map<String,List<Map> address_components = new HashMap<String, List<Map>>();
List<Map> entries = new ArrayList<Map>();
for 1..10 {
entry = new HashMap<String,String>();
entry.put("long_name", xxx);
entry.put("short_name", xxx);
}
address_components.put("address_components", entries);
result.put("result", address_components);
还没有测试过,但我希望你明白这个想法...您需要获得正确的初始数据结构。