如何在 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&lt;String, List&lt;Map&lt;String, List&lt;Map&lt;String, String&gt;&gt;&gt;&gt;&gt;

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&lt;String, String&gt;

【讨论】:

太好了,谢谢!这是否适用于来自 SQL 查找的 N 个结果?或者,您必须写出每个地址组件(即地址组件 1、地址组件 2、...、地址组件 N)吗? Map 和 HashMap/HashTable 有什么区别?谢谢。 循环执行即可。 Map 是一个接口。 HashMap 是一个实现。 HashtableHashMap 的前身,它在十多年前就成功了(请阅读最新的教程/书籍)。 download.oracle.com/javase/tutorial/collections/interfaces/… 所有人的问题:是否可以动态调整 HashTable/HashMap、Map 结构的大小? Java 是否具有动态调整散列大小的内置功能?我一直在调查,到目前为止,除了链接列表之外,我还没有找到答案。谢谢。 MapList 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 对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Collection anylogic 中创建多维数组?

如何在 Laravel/PHP 中创建多维数组

如何在html表中创建多维数组

如何在多维数组/网格c ++中创建List

在 Powershell 中创建多维哈希表数组

无法在 codeigniter 中创建多维数组