首页 > 解决方案 > 如何从 JAX-WS (JAX_RS) 中的 json 请求中获取动态字段

问题描述

我有一个 api,我正在接收一个 json 格式的 Java pojo 请求:

{
   "migrationId" : "32n2342342j";
   "someDynamicField" : {"A" : "", 
                        "B" : ""}
} 

someDynamicField可以有不同的属性名称,我需要从中添加数据。
我不能为这个模型设置一个类,因为该字段是动态的。
但可以肯定的是,这someDynamicField将是字符串类型,但名称会有所不同。
有一件事是肯定的,它someDynamicField可以是有限集合中的一个字符串,例如:[“move”,“source”....],这个集合将来会增长。
例如 :

{
   "migrationId" : "32n2342342j";
   "move" : {"sourHost" : "", 
             "targetHost" : ""}
}

有时可以

{
   "migrationId" : "32n2342342j";
   "delete" : {"sourHost" : "", 
             "targetHost" : ""}
}

从请求中提取此信息的最佳方法是什么?
我试着看看这个:How to map dynamic JSON in JAX-RS
Here they use the vairable name explicit and in my case the field is dynamic?

标签: javajsonjacksonjax-rsrest

解决方案


我会用一个字符串而不是一个对象并用杰克逊解析它。这不是完整的代码,但类似于:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON})
@Path("/blah")
public Response myMethod(String inputObject) {
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode jsonNode = objectMapper.readTree(inputObject);

    String migrationId = jsonNode.get("migrationId");

    if( jsonNode.has("move") ) {
        handleMoveNode(jsonNode.get("move"));
    }
    else if( jsonNode.has("delete") ) {
        handleDeleteNode(jsonNode.get("delete"));
    }
    
    // handle the other node types

    return Response.ok().build();
}

关键是在您的 JAX-RS 方法中获取一个字符串并自己解析它。


推荐阅读