有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中基于输入值的spring boot动态值

我有一节课,如下所示

public class ResponseData {
    private Long entityId;
    private String type;
    private List<String> value;
}

问题陈述:

我正在以JSON格式向调用者发送响应数据列表

类型变量的可能值为“字符串”、“整数”、“日期”、“时间”和“引用”

我的要求是,若类型的值是“整数”或“引用”,那个么值字段的类型应该是整数列表,其余类型字段的所有值,值字段的类型应该是字符串列表


共 (1) 个答案

  1. # 1 楼答案

    可以将参数化类与自定义反序列化器一起使用。这是一个工作代码

    • ResponseData<T>:以列表的元素类型为参数的参数化类
    • DS:一个定制的Jackson反序列化程序,它知道如何映射到ResponseData<T>

    (为了方便起见,我使用了Lombok注释。)

    请注意,ResponseData<T>已经用@JsonDeserialize注释,以指示反序列化到类的对象中应该使用此反序列化器。其余部分应该不言自明

    public class DynamicTypes{
        @NoArgsConstructor @AllArgsConstructor( staticName = "of" )
        @Getter @Setter @ToString
        @JsonDeserialize(using = DS.class)
        public static class ResponseData<T>{
            private Long entityId;
            private String type;
            private List<T> value;
        }
        
        public static void main( String[] args ){
            try{
                ObjectMapper m = new ObjectMapper();
                
                List<String> inputJSONs = Arrays.asList( 
                        "{\"entityId\":1,\"type\":\"String\",\"value\":[\"ONE\",\"TWO\"]}",
                        "{\"entityId\":2,\"type\":\"Integer\",\"value\":[1,2]}" );
                
                for( String json : inputJSONs ) {
                    ResponseData<?> rd = m.readValue( json, ResponseData.class );
                    System.out.println( rd );
                }
            }
            catch( JsonProcessingException e ){
                e.printStackTrace();
            }
        }
        
        private static class DS extends StdDeserializer<ResponseData<?>>{
            protected DS(){
                super( ResponseData.class );
            }
            
            @Override
            public ResponseData<?> deserialize(JsonParser jp, DeserializationContext ctxt) 
              throws IOException, JsonProcessingException {
                JsonNode node = jp.getCodec().readTree( jp );
                String type = node.get( "type" ).asText();
    
                String valueText = node.get( "value" ).toString();
                ObjectMapper om = new ObjectMapper();
                ResponseData<?> rd = new ResponseData<>();
                switch( type ) {
                    case "Integer":
                    case "Reference":
                        ResponseData<Integer> rdInt = new ResponseData<>();
                        List<Integer> valueInt = om.readValue( valueText, new TypeReference<List<Integer>>(){} );
                        rdInt.setValue( valueInt );
                        rd = rdInt;
                        break;
                    default:
                        ResponseData<String> rdStr = new ResponseData<>();
                        List<String> valueStr = om.readValue( valueText, new TypeReference<List<String>>(){} );
                        rdStr.setValue( valueStr );
                        rd = rdStr;
                }
                
                rd.setEntityId( node.get( "entityId" ).asLong() );
                rd.setType( type );
                
                return rd;
            }
        }
    }