为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 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 关注
  • 82 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信