第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

將 json 對象反序列化為具有與 ArrayList 不同行為的列表的最佳方法是什么

將 json 對象反序列化為具有與 ArrayList 不同行為的列表的最佳方法是什么

月關(guān)寶盒 2023-06-14 16:01:31
我的 REST 服務(wù)正在接受一個(gè)class A包含objects B. 所需對象的行為是,如果有一些重復(fù)的條目,則需要添加權(quán)重。使用jackson序列化/反序列化要實(shí)現(xiàn)這一點(diǎn),有兩種方法:如果存在具有相同名稱的條目,則繼承ArrayList并覆蓋添加方法并添加邏輯以求和權(quán)重。@JsonDeserialize在反序列化 JSON 時(shí)使用。首選哪個(gè)選項(xiàng),為什么?class A {  List<B> objects;  // Getters and Setters}class B {  String name;  Float weight;  boolean equals() {    // compares name.  }}示例 JSON{objects:[{name:"X", weight:10.2},{name:"Y",weight:12.5},{name:"X", weight:20}]}這應(yīng)該產(chǎn)生一個(gè)大小為 2 的對象列表,其值為name:X,weight:30.2 and name:Y,weight:12.5.
查看完整描述

3 回答

?
江戶川亂折騰

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊

要實(shí)現(xiàn)這一點(diǎn),有兩種方法:

  1. 如果存在具有相同名稱的條目,則繼承ArrayList并覆蓋添加方法并添加邏輯以求和權(quán)重。

  2. @JsonDeserialize在反序列化 JSON 時(shí)使用。

首選哪個(gè)選項(xiàng),為什么?

順便說一下,您不應(yīng)該使用這些方法中的任何一種。見下文:

  1. add()應(yīng)避免覆蓋執(zhí)行計(jì)算的方法。您可以利用流來處理已添加到列表中的數(shù)據(jù)。

  2. Jackson 應(yīng)該只用于 JSON 解析,而不用于執(zhí)行業(yè)務(wù)邏輯。

事實(shí)上,您應(yīng)該做的是在控制器層接收 JSON,將其解析為列表,然后委托給服務(wù)層,您將在服務(wù)層執(zhí)行分組和求和操作。

此外,重要的是要提到您必須避免在計(jì)算中同時(shí)使用FloatDouble類型,因?yàn)樗鼈冊诰确矫娲嬖趩栴}。改用BigDecimal

最后,這是您的分組和求和方法BigDecimal

public List<B> groupByNameAndSumWeight(List<B> list) {

    return list.stream()

            .collect(groupingBy(B::getName, reducing(BigDecimal.ZERO, B::getWeight, BigDecimal::add)))

            .entrySet().stream()

            .map(entry -> new B(entry.getKey(), entry.getValue()))

            .collect(toList());

}

并確保您具有以下靜態(tài)導(dǎo)入:


import static java.util.stream.Collectors.groupingBy;

import static java.util.stream.Collectors.reducing;

import static java.util.stream.Collectors.toList;


查看完整回答
反對 回復(fù) 2023-06-14
?
蝴蝶刀刀

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊

您可以處理服務(wù)中的對象列表或創(chuàng)建解釋器來處理對象列表,而不是使用自定義實(shí)現(xiàn)來添加或使用 @JsonDeserialize。您可以將以下代碼添加到進(jìn)程列表中,

 objects = objects.stream().collect(Collectors.groupingBy(B::getName, Collectors.summingDouble(B::getWeight)))
            .entrySet().stream().map(ele-> new B(ele.getKey(), ele.getValue()))
            .collect(Collectors.toList());

希望能幫助到你。


查看完整回答
反對 回復(fù) 2023-06-14
?
蝴蝶不菲

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊

這聽起來像是區(qū)分控制器和服務(wù)層的基本原因。讓控制器接受純列表并將其交給進(jìn)行處理的服務(wù)。


@Controller class MyController {

    @Autowired MyService service;

    @PostMapping(..) void postList(@Body List<B> items) {

        service.accept(items);

    }

}

在服務(wù)中,您可以添加權(quán)重。


@Service class MyService {

    JpaRepository<B> repository;

    public void accept(List<B> items) {

        List<B> summed = 

            items.stream().collect(groupingBy(B::getName, summarizingDouble(B::getWeight)))

             .entrySet().stream().map(e -> new B(e.getKey(), e.getValue()))

             .collect(toList());

        repository.save(summed);

    }

}


查看完整回答
反對 回復(fù) 2023-06-14
  • 3 回答
  • 0 關(guān)注
  • 150 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號