java - 如何在 Java 中参数化响应解析?
问题描述
我正在编写一个网络类,并希望能够解析对不同类的不同响应(仍然存在一对一的关系,但我希望有一个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 +
'}';
}
}
也可以看看:
推荐阅读
- c# - 更改 StringCollection 的排序
- neo4j - 密码多关系或两个节点之间关系的属性
- javascript - 在字母数字字符中的任何位置最多允许 2 位数字 javascript 正则表达式
- facebook - Facebook android app v 3.1没有获取出生日期和性别
- c++ - 将单个字符转换为 std::string 前置 \x01
- java - 在 Java 中渲染巨大的关卡
- javascript - 将 AngularJs javascript 文件包含到 Angular cli 中
- ios - 当我尝试在 iOS SWIFT 中调用 api 时,为什么涉及来自另一种语言的特殊字符会导致崩溃?
- java - 通过 String 以外的 Property 使用 XML 配置 Spring Bean(使用 Properties File)
- python - 如何在没有任何默认函数的情况下使用 lambda 划分两列数据