迭代ResponseBody中的项目并将它们放在HashMap Spring Boot中

问题描述 投票:1回答:1

在Spring启动的REST控制器中,我试图迭代RequestBody响应中的值,并将其中的一些放在POST端点的HashMap中。

我发送的JSON具有以下结构:

{"name":"yogurt","vitaminA":6,"vitaminb12":5}

到目前为止,端点看起来像这样:

@RequestMapping("/create")
public NutrientList createNUtrientList(@RequestBody NutrientList nutrientList) {
    Map<String, Double> nutrientMap = new HashMap<String,Double>();
    //get nutrient values, need help with this part
    for()
    //add values to map
    NutrientList nl = new NutrientList(nutrientList.getName(), nutrientMap);
    //will save to repository
    return nl;
}

NutrientList类看起来像这样:

public class NutrientList {
    @Id
    private ObjectId id;
    @JsonProperty("name")
    private String name;
    @JsonProperty("nutrientMap")
    Map <String,Double> nutrientMap = new HashMap<String,Double>();

    public NutrientList() {}

    public NutrientList(String name, Map<String, Double> nutrientMap) {
        this.id = new ObjectId();
        this.name = name;
        this.nutrientMap = nutrientMap;
    }
    //setters and getters
}

数据通过数据库中的单独营养素存储,而不是地图。我看到NutrientList类没有共享相同的结构,但有什么方法可以解决这个问题,以便能够使用地图而不改变它在数据库中的存储方式?

我需要使用地图,因为有很多营养素,我不想为它们分别设置变量。非常感谢。如果有什么不清楚,请告诉我。

编辑:我可以交替将我在数据库中获取数据的csv转换为带有地图的JSON格式,但我还没有找到一个在线工具,这给了我这种灵活性。

json mongodb spring-boot spring-restcontroller
1个回答
1
投票

如果您有有效密钥列表,则可以使用以下内容:

private static final List<String> validKeys = Arrays.asList("vitaminA", "vitaminB" /* ... */);

@RequestMapping("/create")
public NutrientList createNutrientList(@RequestBody Map<String, Object> requestBody) {
    Map<String, Double> nutrientMap = new HashMap<>();
    for (String nutrient : requestBody.keySet()) {
        if (validKeys.contains(nutrient) && requestBody.get(nutrient) instanceof Number) {
            Number number = (Number) requestBody.get(nutrient);
            nutrientMap.put(nutrient, number.doubleValue());
        }
    }
    String name = (String) requestBody.get("name"); // maybe check if name exists and is really a string
    return new NutrientList(name, nutrientMap);
}

如果您想使用Java 8 Stream API,可以尝试:

private static final List<String> validKeys = Arrays.asList("vitaminA", "vitaminB" /* ... */);

@RequestMapping("/create")
public NutrientList createNutrientList(@RequestBody Map<String, Object> requestBody) {
    Map<String, Double> nutrientMap = requestBody.entrySet().stream()
            .filter(e -> validKeys.contains(e.getKey()))
            .filter(e -> e.getValue() instanceof Number)
            .collect(Collectors.toMap(Map.Entry::getKey, e -> ((Number) e.getValue()).doubleValue()));
    String name = Optional.ofNullable(requestBody.get("name"))
            .filter(n -> n instanceof String)
            .map(n -> (String) n)
            .orElseThrow(IllegalArgumentException::new);
    return new NutrientList(name, nutrientMap);
}

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.