2016-11-01 4 views
0

Java 객체에 매핑되는 JSON 객체가 있습니다. JSON은 Java Object가 처리하는 중첩 데이터를 포함합니다. 내 경우는 크기 때문에 내가 시도하고있는 것의 예로서 축소 된 버전을 사용할 것이다.Jackson Java 객체 매핑이 존재하지 않는 '알려진 속성'을보고하지 못합니다.

내 JSON 데이터는 다음과 같습니다 : 데이터 필드가 더 JSON 오브젝트의 목록을 보유하고

{"name":"wmi", "data": [{"ip":"192.168.1.50", "L2CacheSize":"1024", "L2CacheSpeed":"0"}, {"ip":"192.168.1.51", "L2CacheSize":"1024", "L2CacheSpeed":"0"}] }

.

public class WmiData { 
    private String name; 
    private List<Computer> data; 

    //Getters and Setters... 

    //Constructor 
    public WmiData(String name, List<Computer> computers) { 
     this.name = name; 
     this.data = computers; 
    } 

    static class Computer { 
     private String ip; 
     private Integer L2CacheSize; 
     private Integer L2CacheSpeed; 

     public Computer(String ip, Integer L2CacheSize, Integer L2CacheSpeed) { 
      this.ip = ip; 
      this.L2CacheSize = L2CacheSize; 
      this.L2CacheSpeed = L2CacheSpeed; 
     } 

     //Getters and Setters... 

    } 
} 

와 나는이 같은 간단한 매핑하고있는 중이 야 : 이것은 다음과 같습니다 내 자바 객체에 잭슨을 통해 매핑되는

그러나

ObjectMapper mapper = new ObjectMapper(); 
WmiData data = mapper.readValue(jsonString, WmiData.class); 

을, 구문 분석 오류를주고 실패

SEVERE: Failure to convert json to object: 
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "L2CacheSize" (class company.Data.Wmi$Computer), not marked as ignorable (3 known properties: , "ip", "l2CacheSize", "l2CacheSpeed") 
at [Source: {"data":[{"L2CacheSize":"1024","ip":"192.168.1.50","L2CacheSpeed":"0"}, {"L2CacheSize":"1024","ip":"192.168.1.51","L2CacheSpeed":"0"}],"name":"wmi"}; line: 1, column: 26] (through reference chain: company.Data.Wmi["data"]->company.Data.Computer["L2CacheSize"]) 
     at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:79) 
     at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:568) 
     at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:649) 
     at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:830) 
     at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:310) 
     at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:112) 
     at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:226) 
     at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:203) 
     at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23) 
     at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:338) 
     at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:87) 
     at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:290) 
     at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:112) 
     at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2563) 
     at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1805) 
     at uk.co.humboldt.Sums.Service.MessageHandler.getPoll(MessageHandler.java:93) 
     at uk.co.humboldt.Sums.Service.MessageHandler.pollWmi(MessageHandler.java:147) 
     at uk.co.humboldt.Sums.Service.MessageHandler.pollServices(MessageHandler.java:105) 
     at uk.co.humboldt.Sums.Service.MessageHandler.lambda$new$0(MessageHandler.java:72) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 

위의 오류는 Jackson이 알고있는 세 가지 속성, 예를 들어 ip, l2CacheSizel2CacheSpeed 만 인식한다는 것을 설명합니다. 그 중 두 가지가 내 존재하지 않습니다 객체 정의. 내 필드는 L2CacheSize이고 L2CacheSpeed입니다. 둘 다 대문자 'L'을 적어 두십시오. 그것이 호환되지 않는 것이라고 불평하는 데이터 소스는 들어오는 데이터가 Java Object에서 설명한 것과 정확히 같은 형식이지만 아직 실패했다는 것을 명확하게 보여줍니다.

무엇이 문제 일 수 있습니까?

도움을 주시면 감사하겠습니다.

+0

L2CacheSize는 문자열이며 int로 매핑 한 후 문자열 유형으로 변경합니다. –

답변

1

당신이보고있는 문제는 Jackson이 Java Bean 명명 규칙을 사용하여 Java 클래스의 Json 속성을 파악하기 때문입니다.

그래서 해결하기 위해 속성 이름을 예를 들어 @JsonProperty("L2CacheSize")으로 "알기"또는 주석을달라고 잭슨이 말한 것으로 변경할 수 있습니다.

static class Computer { 
    private String ip; 

    @JsonProperty("L2CacheSize") 
    private Integer L2CacheSize; 

    @JsonProperty("L2CacheSpeed") 
    private Integer L2CacheSpeed; 

    public Computer(String ip, Integer L2CacheSize, Integer L2CacheSpeed) { 
     this.ip = ip; 
     this.L2CacheSize = L2CacheSize; 
     this.L2CacheSpeed = L2CacheSpeed; 
    } 

    //Getters and Setters... 

} 
+0

훨씬 간단한 변수 이름이 포함 된 클래스에서 동일한 작업을 수행 할 때이 문제가 발생하지 않았습니다. 솔직하게 잭슨이 구체적으로 카멜 케이스 변수 이름을 찾고 있습니까? – Shiri

+1

그래, Jackson이 Java Bean을 명명 규칙으로 명명 했으므로, 그 이름은 낙타의 경우 여야하고 다른 규칙이 있어야하지만 위반하는 것은 낙타의 경우이다. l2CacheSize와 같은 변수의 이름을 지정하지 않으면 annotation –

+0

그것은 이미 정의 된 변수 이름을 부정확 한 것으로 변환하기 때문에 끔찍하게 설계된 IMHO처럼 보입니다. 이름 짓기 관례를 지키면서 혼동 스럽거나 잘못 생각하는 것처럼 조용한 속성 정의가 필요하지 않은 것은이 경우 중요합니다. 당신의 도움을 주셔서 감사합니다. – Shiri

-2

DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES을 false로 설정하기 만하면됩니다.

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
WmiData data = mapper.readValue(jsonString, WmiData.class);