【问题标题】:How do I create a multidimensional HashMap or Hashtable in JSP / Java and convert it to a JSON object?如何在 JSP/Java 中创建多维 HashMap 或 Hashtable 并将其转换为 JSON 对象?
【发布时间】: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。因此,问题始于未正确构建多维散列。不过,我不确定是什么问题。我会很感激一些帮助。谢谢。

【问题讨论】:

    标签: java json jsp hashtable multidimensional-array


    【解决方案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);
    

    还没有测试过,但我希望你能明白……你需要正确的初始数据结构。

    【讨论】:

      猜你喜欢
      • 2012-08-22
      • 2011-02-02
      • 2011-08-06
      • 1970-01-01
      • 2018-02-17
      • 2017-08-31
      • 2014-05-19
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多