【问题标题】:how to serialize multi-level json using jackson in spring?如何在spring中使用jackson序列化多级json?
【发布时间】:2015-09-23 22:05:57
【问题描述】:

这是端点 /foo/bar 预期的响应正文。

如您所见,这是嵌套的json,因此对于每个级别我都需要Java object。构建这个的有效方法是什么?我正在使用Spring 4.1,而后者又使用Jacksonserialize POJO。

{
    "user": {
        "status": {
            "state": "active",
            "message": [
                "registered on 01.10.2015"
            ]
        }
    },
    "features": {
        "xbox": {
            "state": "enabled",
            "message": [
                "foo",
                "bar"
            ]
        },
      "playstation": {
            "state": "disabled",
            "message": [
                "hello ",
                "world"
            ]
        }
    }
}

这是我的想法

  @RequestMapping("foo/bar")
    @ResponseBody
    public Result getData(long id){

    Result result = getUserData(id);

    return result;
    }

public class Result {

   private User user;

   private List<Feature> features;

   //getters and setters

}

public class Status {

       private State state;

       private Message messages;

       //getters and setteers
}

public class State {

   private String state;
   //getters and setters
}

public class Message {

     private List<String> messages; 
     //getters and setters

}

同样对于“features”节点,我会为Json对象的每一层构造Java POJO。我知道使用 objectMapperJsonNode 但想知道是否可以使用 java 对象有效地构造嵌套的 json。

【问题讨论】:

  • “高效”是什么意思?假设它有效,您为什么认为您当前的设计不是“高效”的?
  • @kryger:Pojo 太多,只有一个字段。
  • 我认为您的建议是进行此序列化的最干净和正确的方法,因为当您最后将此 json 序列化为 POJO 时,您将拥有 POJO 而不是 JsonObjects,并且您可以轻松访问方法和属性在 POJO 中。这就是我的想法。

标签: spring spring-mvc jackson


【解决方案1】:

State 这样的类可以是一个枚举,如果你确定只有有限的值域。 Message 不应该是一个单独的类——只需将 List&lt;String&gt; message 直接嵌入到 Status 中即可。

如果您想要更紧凑的表示,您始终可以提供自己的序列化器/反序列化器类来自定义翻译。

【讨论】:

  • 所以对于每个 json 节点,没有 POJO 就无法逃脱(除非我使用自定义序列化程序)。
猜你喜欢
  • 2014-06-13
  • 2015-03-19
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多