Как мне создать многомерный HashMap или Hashtable в JSP / Java и преобразовать его в объект JSON? - PullRequest
2 голосов
/ 12 мая 2011

Мне нужна помощь в создании многомерного HashMap или Hashtable в JSP. Зачем мне нужен HashMap или HashTable? Потому что в конечном итоге я хочу передать клиенту объект JSON. Если есть другой способ достичь JSON-объекта, у меня все в ушах.

Я также хотел упомянуть, что эта тема была неоценима, и я расширяю ее:

Как написать многомерный объект JSON в JSP и передать объект 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. Итак, проблема начинается с неправильного построения многомерного хеша. Я не уверен, в чем проблема, хотя. Буду признателен за помощь. Спасибо.

Ответы [ 3 ]

4 голосов
/ 12 мая 2011

В 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>.

1 голос
/ 12 мая 2011

Строка

results_hash.put ("results", arr [i]);

перезапишет последнюю запись тем же ключом в вашей Hashtable.Вы просто заменяете запись ключом "results", а не добавляете к ней.

Попробуйте что-то вроде (псевдокод):

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);

Не проверяли, но я надеюсь, что вы получитеидея ... вам нужно правильно определить исходную структуру данных.

1 голос
/ 12 мая 2011

попробуйте

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);
...