我有一些示例对象将包含在 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 9
Map.entry
,则可以将其替换为较旧的new AbstractMap.SimpleEntry(x.language, x.text)
- 不确定
Item
中是否真的需要地图列表,它只是为了满足需求和Arrays.asList(e.getValue())
;地图实例应该没问题。 - 在类
Item
@JsonNaming
注释中使用杰克逊SnakeCaseStrategy
,以保证item_id
的正确序列化。
更新
修复并在类中添加了一个重载的构造函数Item
transform
中使用的方法引用Item::new