如何在JSP / Java中创建多维HashMap或Hashtable并将其转换为JSON对象



我需要帮助在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);

还没有测试过,但我希望你明白这个想法...您需要获得正确的初始数据结构。

最新更新