当前位置: 首页 > 面试题库 >

如何参数化Java中的响应解析?

卞浩漫
2023-03-14
问题内容

我正在编写一个网络类,并希望能够解析对不同类的不同响应(仍然存在一对一的关系,但是我想拥有一个parseResponse()可以处理来自不同端点的所有响应的单个类,并endpoint.className具有预期的
classType 我应该映射到):

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

但是仍然存在相同的类型错误。


问题答案:

您应该将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 +
                '}';
    }
}


 类似资料:
  • 本文向大家介绍vue-router如何响应路由参数的变化?相关面试题,主要包含被问及vue-router如何响应路由参数的变化?时的应答技巧和注意事项,需要的朋友参考一下 ickt-5: 路由 vue-router 面试题: https://blog.csdn.net/Arthas_Xue/article/details/101024666 在父组件的router-view上加个key: http

  • 问题内容: 我想解析以下Json响应: 我尝试使用SIMPLE JSON解析器,但这对我不起作用: 问题答案: 输出: 评论: 我没有添加验证 [编辑] 加载json字符串的其他方法

  • Response对象提供了一系列方法用于设置响应参数,包括设置输出内容、状态码及header信息等,并且支持链式调用以及多次调用。 设置数据 Response基类提供了data方法用于设置响应数据。 response()->data($data); json()->data($data); 不过需要注意的是data方法设置的只是原始数据,并不一定是最终的输出数据,最终的响应输出数据是会根据当前的R

  • 问题内容: 我正在使用来自Apache的HTTP客户端,并且正在尝试从我从客户端获得的响应中解析JSON数组。 这是我收到的JSON的示例。 我正在使用http://code.google.com/p/json-simple/作为json库。 这是我尝试过的代码,但是没有用。我不太确定该怎么办。任何帮助表示赞赏,谢谢。 问题答案: BufferedReader rd = new BufferedR

  • 问题内容: 我对iOS应用程序开发非常陌生,并且从服务器收到以下响应: 请任何人帮助我了解如何在我的应用程序中使用员工ID和员工姓名。 问题答案: 您的JSON数据看起来像“嵌套JSON”,这意味着您必须将其反序列化两次。 第一个反序列化从您的JSON数据中提取一个字符串: 现在是字符串 再次是JSON数据。第二个反序列化提取数组: 现在您可以像访问它

  • 问题内容: 我收到此响应的结果是对服务器的GET请求 我只想从上述json响应中提取的值。 我正在使用此代码来获得此响应 我的问题是,我该如何解析并获取only 标签的值。谢谢 问题答案: 您可以解析当前的json字符串以从中获取它: