2011-12-07 26 views
37

Tôi sử dụng jackson để chuyển đổi JSON thành lớp Đối tượng.jackson Trường không được công nhận

JSON:

{ 
    "aaa":"111", 
    "bbb":"222", 
    "ccc":"333" 
} 

Object Class:

class Test{ 
    public String aaa; 
    public String bbb; 
} 

Code:

ObjectMapper mapper = new ObjectMapper(); 
Object obj = mapper.readValue(content, valueType); 

Mã của tôi ném ngoại lệ như thế:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "cccc" (Class com.isoftstone.banggo.net.result.GetGoodsInfoResult), not marked as ignorable 

Và tôi không muốn thêm một prop để kiểm tra lớp học, tôi chỉ muốn jackson chuyển đổi giá trị tồn tại whith cũng tồn tại trong thử nghiệm.

Trả lời

71

Jackson cung cấp một vài cơ chế khác nhau để định cấu hình xử lý các phần tử JSON "phụ". Sau đây là ví dụ về cách định cấu hình ObjectMapper thành không FAIL_ON_UNKNOWN_PROPERTIES.

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.DeserializationConfig; 
import org.codehaus.jackson.map.ObjectMapper; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    // { "aaa":"111", "bbb":"222", "ccc":"333" } 
    String jsonInput = "{ \"aaa\":\"111\", 
          \"bbb\":\"222\", 
          \"ccc\":\"333\" }"; 

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, 
         Visibility.ANY); 
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, 
        false); 

    Test test = mapper.readValue(jsonInput, Test.class); 
    } 
} 

class Test 
{ 
    String aaa; 
    String bbb; 
} 

Đối với các phương pháp khác, xem http://wiki.fasterxml.com/JacksonHowToIgnoreUnknown

+1

Thật tuyệt vời! Làm thế nào bạn có được nó? Cảm ơn bạn rất nhiều! – YETI

+20

Lưu ý rằng đối với 2.x bạn sẽ sử dụng ['mapper.configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);'] (http://wiki.fasterxml.com/JacksonFeaturesDeserialization) để thay thế. – Supr

36

Tính đến Jackson 2,0 enum trong (DeserializationConfig.Feature) đã được chuyển đến một enum độc lập (DeserializationFeature):

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

15

Nếu bạn đang sử dụng Jackson 2.0 (fasterxml)

ObjectMapper mapper = new ObjectMapper(); 
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 
4

Điều quan trọng là trước khi nhận thấy sự thay đổi quan trọng của mô hình có thể dẫn đến sự phân tích logic nghiệp vụ.

Để kiểm soát tốt hơn ứng dụng, tốt hơn là xử lý ngoại lệ này theo cách thủ công.

objectMapper.addHandler(new DeserializationProblemHandler() { 

      @Override 
      public boolean handleUnknownProperty(DeserializationContext ctxt, 
        JsonParser jp, JsonDeserializer<?> deserializer, 
        Object beanOrClass, String propertyName) 
        throws IOException, JsonProcessingException { 

       String unknownField = String.format("Ignoring unknown property %s while deserializing %s", propertyName, beanOrClass); 
       Log.e(getClass().getSimpleName(), unknownField); 
       return true; 
      } 
     }); 

Return đúng để xử lý UnrecognizedPropertyException

Đừng bỏ qua lĩnh vực âm thầm không được công nhận.

+0

Tôi nghĩ rằng nó quá rộng để chỉ nói "không". Khi nói đến api và linh hoạt để thay đổi các phiên bản, tôi là một fan hâm mộ của Luật của Postel. https://en.wikipedia.org/wiki/Robustness_principle –

Các vấn đề liên quan