如何在 JSP/Java 中创建多维 HashMap 或 Hashtable 并将其转换为 JSON 对象?
Posted
技术标签:
【中文标题】如何在 JSP/Java 中创建多维 HashMap 或 Hashtable 并将其转换为 JSON 对象?【英文标题】:How do I create a multidimensional HashMap or Hashtable in JSP / Java and convert it to a JSON object? 【发布时间】:2011-08-24 07:26:48 【问题描述】:我需要帮助在 JSP 中创建多维 HashMap 或 Hashtable。为什么我需要 HashMap 或 HashTable?因为我最终想将一个 JSON 对象传回给客户端。如果有另一种方法最终到达 JSON 对象,我会全力以赴。
我还想提一下,这个帖子非常宝贵,我一直在扩展它:
How can I write a multidimensional JSON object in JSP and pass the JSON object back to 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。因此,问题始于未正确构建多维散列。不过,我不确定是什么问题。我会很感激一些帮助。谢谢。
【问题讨论】:
【参考方案1】:在 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!
最好只使用完全有价值的 Javabeans 而不是 Map<String, String>
。
【讨论】:
太好了,谢谢!这是否适用于来自 SQL 查找的 N 个结果?或者,您必须写出每个地址组件(即地址组件 1、地址组件 2、...、地址组件 N)吗? Map 和 HashMap/HashTable 有什么区别?谢谢。 循环执行即可。Map
是一个接口。 HashMap
是一个实现。 Hashtable
是 HashMap
的前身,它在十多年前就成功了(请阅读最新的教程/书籍)。 download.oracle.com/javase/tutorial/collections/interfaces/…
所有人的问题:是否可以动态调整 HashTable/HashMap、Map 结构的大小? Java 是否具有动态调整散列大小的内置功能?我一直在调查,到目前为止,除了链接列表之外,我还没有找到答案。谢谢。
Map
和 List
ARE 可动态调整大小。只需致电add()
或put()
添加新项目,就像我的回答一样。单击我之前评论中的教程链接以了解更多信息。
感谢您的知识和建议。我会看一下链接并研究它。感谢您的帮助。【参考方案2】:
试试这个
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);
【讨论】:
这很好用,只是最后一个结果在 JSON 对象中存储了 10 次(即 Number=9,Numberx2=18)。不过谢谢。不过,我不明白为什么您的解决方案没有产生预期的结果。我也会看看其他解决方案。 我稍微修改了您的示例并收到了练习所需的结果。所以,再次感谢你。代码:Hashtable results_hash = new Hashtable();哈希表数字[] = 新哈希表[10];哈希表 [] arr = 新哈希表 [10]; for (int i=0; i 【参考方案3】:线
results_hash.put("results",arr[i]);
将使用 Hashtable 中的相同键覆盖最后一个条目。您只是用关键“结果”替换条目,而不是添加到它。
尝试类似(伪代码):
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);
还没有测试过,但我希望你能明白……你需要正确的初始数据结构。
【讨论】:
以上是关于如何在 JSP/Java 中创建多维 HashMap 或 Hashtable 并将其转换为 JSON 对象?的主要内容,如果未能解决你的问题,请参考以下文章