亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何在 Java 中參數化響應解析?

如何在 Java 中參數化響應解析?

aluckdog 2023-06-14 16:43:01
我正在編寫一個網絡類,并希望能夠解析對不同類的不同響應(仍然存在一對一的關系,但我希望有一個單一的來parseResponse()處理來自不同端點的所有響應,并endpoint.className具有預期的類類型我應該映射到):private Class<?> parseResponse(StringBuilder responseContent, Endpoint endpoint) {    ObjectMapper mapper = new ObjectMapper();    try {        Class<?> object = mapper.readValue(responseContent.toString(), endpoint.className);        // endpoint.className has Class<?> type        if (object instanceof endpoint.className) {        }    } catch (IOException e) {        // handle errors    }}但是如果我寫的話就會出錯if (object instanceof endpoint.className)更新:可能更好的選擇是向類添加parse()方法Endpoint:public Class<?> parseResponse(String responseContent) {   // this.className has Class<?> type (e.g., Foo.class).}public enum Endpoint {    FOO (Foo.class),    BAR (Bar.class);    private Class<?> classType;}但是仍然存在相同類型的錯誤。
查看完整描述

1 回答

?
月關寶盒

TA貢獻1772條經驗 獲得超5個贊

您應該將JSON反序列化與應用程序的其他部分分開。您不能為所有響應實現一種方法,但您的響應數量可能有限,您可以為每個類聲明一些簡單的方法。通常,您只能使用一種聲明如下的方法:


public <T> T deserialise(String payload, Class<T> expectedClass) {

    Objects.requireNonNull(payload);

    Objects.requireNonNull(expectedClass);


    try {

        return mapper.readValue(payload, expectedClass);

    } catch (IOException e) {

        throw new IllegalStateException("JSON is not valid!", e);

    }

現在,您可以反序列化您想要的所有有效負載。您需要提供要接收的JSON負載和類。POJO


顯示該概念的簡單工作解決方案:


import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.databind.DeserializationFeature;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.SerializationFeature;


import java.io.IOException;

import java.util.Objects;


public class JsonMapper {


    private final ObjectMapper mapper = new ObjectMapper();


    public JsonMapper() {

        // configure mapper instance if required

        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

        // etc...

    }


    public String serialise(Object value) {

        try {

            return mapper.writeValueAsString(value);

        } catch (JsonProcessingException e) {

            throw new IllegalStateException("Could not generate JSON!", e);

        }

    }


    public <T> T deserialise(String payload, Class<T> expectedClass) {

        Objects.requireNonNull(payload);

        Objects.requireNonNull(expectedClass);


        try {

            return mapper.readValue(payload, expectedClass);

        } catch (IOException e) {

            throw new IllegalStateException("JSON is not valid!", e);

        }

    }


    public Foo parseResponseFoo(String payload) {

        return deserialise(payload, Foo.class);

    }


    public Bar parseResponseBar(String payload) {

        return deserialise(payload, Bar.class);

    }


    public static void main(String[] args) {

        JsonMapper jsonMapper = new JsonMapper();


        String bar = "{\"bar\" : 2}";

        System.out.println(jsonMapper.parseResponseBar(bar));


        String foo = "{\"foo\" : 1}";

        System.out.println(jsonMapper.parseResponseFoo(foo));


        System.out.println("General method:");

        System.out.println(jsonMapper.deserialise(foo, Foo.class));

        System.out.println(jsonMapper.deserialise(bar, Bar.class));

    }

}


class Foo {


    public int foo;


    @Override

    public String toString() {

        return "Foo{" +

                "foo=" + foo +

                '}';

    }

}


class Bar {


    public int bar;


    @Override

    public String toString() {

        return "Bar{" +

                "bar=" + bar +

                '}';

    }

}


查看完整回答
反對 回復 2023-06-14
  • 1 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號