Java ArrayList of hasMap to return in Spring endpoint



我有一些示例对象将包含在 ArrayList 中,这些项目必须以特定格式出现,每个项目必须是 json 返回中数组的新位置。

遵循我到目前为止开发的代码:

import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
public class MyClass {

String text = "hi";
String language = "pt-br";
String item = "1";

public static void main(String args[]) {

MyClass myObj1 = new MyClass();
myObj1.text = "ola";
myObj1.language = "pt-br";
myObj1.item = "1";


MyClass myObj2 = new MyClass();
myObj2.text = "hi";
myObj2.language = "en";
myObj2.item = "1";

MyClass myObj3 = new MyClass();
myObj3.text = "holaa";
myObj3.language = "es";
myObj3.item = "2";

MyClass myObj4 = new MyClass();
myObj4.text = "olaaaaa";
myObj4.language = "pt-br";
myObj4.item = "2";
MyClass myObj5 = new MyClass();
myObj5.text = "helllooo";
myObj5.language = "eng";
myObj5.item = "3";

List<MyClass> lang = new ArrayList<MyClass>();
lang.add(myObj1);
lang.add(myObj2);
lang.add(myObj3);
lang.add(myObj3);
lang.add(myObj4);

ArrayList<HashMap<String, String>> lista = new ArrayList<>();

HashMap<String, String> mapa = new HashMap<>();

for(int i = 0; i < lang.size();i++) {


if(i > 0 && lang.get(i).item != lang.get(i-1).item) {

lista.add(mapa);
mapa.clear();
}

if(i == lang.size()-1){
lista.add(mapa);
mapa.clear();
}

mapa.put(lang.get(i).language, lang.get(i).text); 


}



System.out.println(lista.toString());

}
}

应在此模式中返回:

[{
"item_id": 1,
"language": [{
"pt-br": "ola",
"en": "hii"
}]
}, {
"item_id": 2,
"language": [{
"es": "holaa",
"pt-br": "olaaaaa"
}]
}, {
"item_id": 3,
"language": [{
"eng": "helllooo"
}]
}]

Spring 的整个部分已经实现,我需要操作结果,以便它在我的端点中正确显示。

值得实现一个Item对象,然后将输入List<MyClass> lang转换为List<Item>

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Item {
int item_id;
List<Map<String, String>> language; // perhaps Map<String, String> would do fine
Item(Map.Entry<Integer, Map<String, String>> entry) {
this(entry.getKey(), entry.getValue());
}

Item(int id, Map<String, String> language) {
this.item_id = id;
this.language = Arrays.asList(language);
}

public String toString() {
return String.format("item_id: %d,%nlanguage: %s%n", item_id, language);
}
// getters/setters
}
// MyClass.java
static List<Item> transform(List<MyClass> data) {
return data
.stream()
.collect(Collectors.groupingBy(
x -> Integer.parseInt(x.item), // to become int `item_id`
LinkedHashMap::new,            // keep insertion order 
Collectors.mapping(            // prepare map language:text
x -> Map.entry(x.language, x.text),  // Java 9
Collectors.toMap(
Map.Entry::getKey, 
Map.Entry::getValue, 
(a, b) -> a,           // merge occasional duplicates
LinkedHashMap::new)    // keep insertion order or TreeMap to sort by language
)
))
.entrySet().stream()
.map(Item::new)  // referencing overloaded constructor
.collect(Collectors.toList());
}

测试

List<Item> items = transform(lang);
items.forEach(System.out::println);

输出

item_id: 1,
language: [{pt-br=ola, en=hi}]
item_id: 2,
language: [{es=holaa, pt-br=olaaaaa}]
item_id: 3,
language: [{eng=helllooo}]

评论:

  • 如果无法使用 Java 9Map.entry,则可以将其替换为较旧的new AbstractMap.SimpleEntry(x.language, x.text)
  • 不确定Item中是否真的需要地图列表,它只是为了满足需求和Arrays.asList(e.getValue());地图实例应该没问题。
  • 在类Item@JsonNaming注释中使用杰克逊SnakeCaseStrategy,以保证item_id的正确序列化。

更新
修复并在类中添加了一个重载的构造函数Itemtransform中使用的方法引用Item::new

最新更新