Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果json可能具有不同的结构,如何将json转换为java对象_Java_Json_Jackson - Fatal编程技术网

如果json可能具有不同的结构,如何将json转换为java对象

如果json可能具有不同的结构,如何将json转换为java对象,java,json,jackson,Java,Json,Jackson,我想使用java从url中读取返回值。响应可能是json { token:"blablablabla", expired: 7200 } 或采用以下形式: { errcode: 201 errmsg: "out of limited" } 我目前使用jackson将json转换为java对象。但在我的情况下,json的响应可能会有所不同。我发现的所有示例和教程都只处理一种形式的json字符串 我想知道处理这种情况的最佳实践是什么。目前,我只捕获JsonMappin

我想使用java从url中读取返回值。响应可能是json

{
   token:"blablablabla",
   expired: 7200
}
或采用以下形式:

{
    errcode: 201
    errmsg: "out of limited"
}
我目前使用jackson将json转换为java对象。但在我的情况下,json的响应可能会有所不同。我发现的所有示例和教程都只处理一种形式的json字符串


我想知道处理这种情况的最佳实践是什么。目前,我只捕获JsonMappingException e并再次尝试转换为其他类。

正确的答案是响应带有一个清晰的标记,指示它要表示的类

如果没有这些,您将陷入要么随机尝试,要么想出另一种加载机制的困境

一种方法可能是将JSON读入树、映射或其他标记的数据结构,然后使用反射来尝试查找一个类,该类的字段与JSON给定的字段名匹配。。。这将是处理问题的一种相当痛苦和脆弱的方式

或者您可以跳过后一阶段,只处理抽象数据结构,就像XML用户处理文档对象模型一样。当然,通过这种方式,您将无法访问特定对象上的任何方法,而且您还必须想出某种逻辑,识别足够的内容来使用它做一些有用的事情。。。但它可以让您检查和操作这些内容,而不必事先知道返回了哪个对象

据我所知,errcode和errmsg是常见的响应属性。因此,您可能希望创建一个抽象类或接口,比如JsonResponse,它保存这些公共属性,并让所有响应类继承JsonResponse。因此,在代码中,您可以首先通过检查这些属性来检查响应是否有错误

例如

以及

编辑:
改为Allan更正的“抽象类”。

我发现我的问题与此非常相似。可能这个问题没有令人满意的答案。感谢您添加详细的代码片段。这是一个很好的解决办法。我认为像java这样的静态类型语言可能很难处理这种灵活的表示。是的,对于任何此类“绑定/映射”需求json、jaxb、jpa等,我们必须确定对象中的“所有可能属性”,并尝试派生接口/抽象类来保存公共属性[P.S.如果你觉得这很有用,你可能会想‘接受’我的答案。)我知道如何使用stackoverflow:我只是仍然在期待一个更好的解决方案。谢谢,伙计!我相信你会的,我只是在履行我的职责。没有义务:干杯!顺便说一句,我认为我们应该使用公共抽象类而不是公共接口
public abstract Class JsonResponse {
  private String errcode;
  private String errmsg;
  //getters...
  //setters...
}
public class MyResponse extends JsonResponse {
  private String token;
  private String expired;
  //getters...
  //setters...
}