我正在编写一个网络类,并希望能够解析对不同类的不同响应(仍然存在一对一的关系,但是我想拥有一个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字符串以从中获取它: