2015-09-25 4 views
1

У меня проблема с картотекой Jackson Json, которую я не могу понять, как решить.Rest Json Jackson Mapper Пользовательский сопоставление объектов

У меня есть приложение Spring MVC Rest, и конечные точки преобразуются в Json, используя Jackson.

Некоторые из объектов результатов содержат тип, который я хочу изменить, прежде чем он преобразуется.

В частности, объект результата может выглядеть следующим образом.

ResultObject 
    - getDoubleMap() : DoubleMap 
     - getDoubleEntries() : List<DoubleEntry> 
     - toMap() : Map<String, Double> 

То, что я хочу сделать, это не Джексон преобразовать экземпляр DoubleMap, но гораздо лучше переопределить его как этот

Object someJacksonMapInterceptor(Object object) { 
    if(object instanceof DoubleMap) { 
     return ((DoubleMap) object).toMap(); 
    } 
    return object; 
} 

Я замученного Google довольно долгое время и не простое решение. Надеюсь, кто-то может посоветовать.

Большое спасибо заранее.

ответ

0

В одном приложении мы настраиваем дату, возможно, вы можете использовать ее для своей пользовательской десеролизации.

public class VitalSign { 

    public static final String DATE_FORMAT1 = "yyyy-MM-dd'T'HH:mm:ssZ"; 
    public static final String DATE_FORMAT2 = "yyyy-MM-dd'T'HH:mm:ss"; 
    //public static final String DATE_FORMAT3 = "yyyy-MM-dd'T'HH:mm:ssTDZ"; 
    public static final String DATE_FORMAT4 = "MMM dd, yyyy h:mm:ss aa"; 


    @NotNull 
    @Column(name = "observed") 
    @Temporal(TemporalType.TIMESTAMP) 
    @DateTimeFormat(style = "M-") 
    @JsonDeserialize(using = CustomJsonDateDeserializer.class) 
    private Date timestamp; 



    public static class CustomJsonDateDeserializer extends JsonDeserializer<Date> { 


     public CustomJsonDateDeserializer() { 
      super();    
     } 

     @Override 
     public Date deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException, JsonProcessingException { 

      SimpleDateFormat[] formats = { new SimpleDateFormat(DATE_FORMAT1), new SimpleDateFormat(DATE_FORMAT2), new SimpleDateFormat(DATE_FORMAT4, Locale.US) }; 
      String date = jsonparser.getText(); 
      for (SimpleDateFormat format : formats) { 
       try { 
        return format.parse(date); 
       } catch (ParseException e) { 
       }    
      } 
      throw new RuntimeException("Unparseable date " + date); 

     } 

    } 
} 
0

Для сериализации, вы можете просто аннотировать метод toMap() с @JsonValue. Для десериализации, если у вас есть статическая фабрика для создания DoubleMap с Map<String, Double>, вы можете просто добавить комментарий к этому вопросу с помощью @JsonCreator.

private final ObjectMapper mapper = new ObjectMapper(); 

@Test 
public void serialize_doublemap() throws Exception { 
    DoubleMap map = new DoubleMap(); 
    map.put("red", 0.5); 
    map.put("orange", 0.7); 
    assertThat(mapper.writeValueAsString(map), equivalentTo("{ red: 0.5, orange: 0.7 }")); 
} 

@Test 
public void deserialize_doublemap() throws Exception { 
    assertThat(mapper.readValue("{ \"red\": 0.5, \"orange\": 0.7 }", DoubleMap.class).toMap(), 
      equalTo(ImmutableMap.of("red", 0.5, "orange", 0.7))); 
} 

public static class DoubleMap { 
    public List<DoubleEntry> entries = new ArrayList<>(); 

    public void put(String label, double value) { 
     entries.add(new DoubleEntry(label, value)); 
    } 

    @JsonCreator 
    public static DoubleMap fromJson(Map<String, Double> input) { 
     DoubleMap map = new DoubleMap(); 
     input.forEach(map::put); 
     return map; 
    } 

    public List<DoubleEntry> getDoubleEntries() { 
     return entries; 
    } 

    @JsonValue 
    public Map<String, Double> toMap() { 
     return entries.stream().collect(Collectors.toMap(e -> e.label, e -> e.value)); 
    } 
} 

public static final class DoubleEntry { 
    public final String label; 
    public final double value; 

    public DoubleEntry(String label, double value) { 
     this.label = label; 
     this.value = value; 
    } 
} 
Смежные вопросы