Java Spring 端点中 return 的 hashMap 的 ArrayList

Java ArrayList of hasMap to return in Spring endpoint

我有一些示例对象将包含在一个ArrayList中,这些项目必须以特定格式出现,每个项目必须是一个新位置的问题json return.

中的数组

遵循我目前开发的代码:

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

应该return以这种模式编辑:

[{
    "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}]

评论:

  • if Java 9 Map.entry 不能用,可以换成旧的new AbstractMap.SimpleEntry(x.language, x.text)
  • 不确定 Item 中是否真的需要地图列表,提供它只是为了满足要求以及 Arrays.asList(e.getValue());地图实例应该没问题。
  • in Item class 在 @JsonNaming 注释中使用 Jackson SnakeCaseStrategy 来保证 item_id.
  • 的正确序列化

更新
修复并在 Item class 中添加了重载构造函数,在 transform

中使用了方法参考 Item::new