Belirli bir JSON dizesini bir Java nesnesine dönüştürmem gerekiyor. JSON işleme için Jackson kullanıyorum. Giriş JSON'u üzerinde hiçbir kontrolüm yok (bir web servisinden okuyorum). Bu benim giriş JSON'um:
{"wrapper":[{"id":"13","name":"Fred"}]}
İşte basitleştirilmiş bir kullanım örneği:
private void tryReading() {
String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
ObjectMapper mapper = new ObjectMapper();
Wrapper wrapper = null;
try {
wrapper = mapper.readValue(jsonStr , Wrapper.class);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("wrapper = " + wrapper);
}
Benim varlık sınıfım:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
Wrapper sınıfım temelde öğrenci listemi almak için bir konteyner nesnesidir:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Bu hatayı almaya devam ediyorum ve "wrapper" null
döndürüyor. Neyin eksik olduğundan emin değilim. Biri yardım edebilir mi lütfen?
org.codehaus.jackson.map.exc.UnrecognizedPropertyException:
Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
at [Source: java.io.StringReader@1198891; line: 1, column: 13]
(through reference chain: Wrapper["wrapper"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
.from(UnrecognizedPropertyException.java:53)
Jackson'ın sınıf düzeyinde ek açıklamasını kullanabilirsiniz:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
@JsonIgnoreProperties
class { ... }
POJO'nuzda tanımlamadığınız her özelliği yok sayacaktır. JSON'da sadece birkaç özellik aradığınızda ve tüm eşlemeyi yazmak istemediğinizde çok kullanışlıdır. Daha fazla bilgi Jackson'ın web sitesinde. Bildirilmemiş herhangi bir özelliği yok saymak istiyorsanız, yazmalısınız:
@JsonIgnoreProperties(ignoreUnknown = true)
İlk cevap neredeyse doğrudur, ancak gereken şey alan DEĞİL getter yöntemini değiştirmektir - alan özeldir (ve otomatik olarak algılanmaz); ayrıca, her ikisi de görünürse getter'ların alanlara göre önceliği vardır (özel alanları da görünür hale getirmenin yolları vardır, ancak getter'a sahip olmak istiyorsanız çok fazla anlamı yoktur).
Bu nedenle getter ya getWrapper()
olarak adlandırılmalı ya da getWrapper()
ile açıklanmalıdır:
@JsonProperty("wrapper")
Getter yöntem adını olduğu gibi tercih ederseniz.
Jackson, Wrapper sınıfınızda "wrapper" olarak adlandırılan bir alan bulamadığı için şikayet ediyor. Bunu yapıyor çünkü JSON nesnenizin "wrapper" adında bir özelliği var.
Sanırım düzeltme, Wrapper sınıfınızın alanını "students" yerine "wrapper" olarak yeniden adlandırmaktır.