![](/img/trans.png)
[英]How can I start a Jackson JSON ObjetMapper at a specific key?
[英]How can I find the JSON key of a field (jackson)?
我有以下問題:我像往常一樣使用jackson.databind.ObjectMapper
導出我的用戶對象,並且工作正常: ({"address":{"village":"NY"},"prename":"Joe"})
。
現在我必須使用Java反射獲取密鑰(用於address
和prename
)。 如果該字段具有注釋@JsonProperty
,則獲取此密鑰沒有問題。 但是這個注釋並不存在於所有字段中(例如m_address
字段)。
傑克遜映射器如何知道每個Json對象中的哪個字段要分配給類對象? 我讀到ObjectMapper
試圖調用getter左右。
但我不知道如何才能找到合適的吸氣劑。
我知道這可能不是解決我問題的最美妙的方法,但我沒有在ObjectMapper
上找到任何方法,如: mapper.getJSONKeyByName(field)
。 如果這樣的事情存在甚至更好。 :)
有沒有辦法找到一個正確的getter到一個字段,並在ObjectMapper
上存在像mapper.getJSONKeyByName(field)
這樣的東西?
Main.java
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Object to JSON as usual
mapper.writeValue(System.out, new User("Joe", new Address("NY")));
// {"address":{"village":"NY"},"prename":"Joe"}
// Lookup with reflection
for (Field field : User.class.getDeclaredFields()) {
field.setAccessible(true);
try {
if (field.isAnnotationPresent(JsonProperty.class)) {
System.out.println("JSON-Key with annotation: " +
field.getAnnotation(JsonProperty.class).value());
// JSON-Key with annotation: prename
} else {
//TODO do something to get "JSON-Key without annotation: address
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
User.java
public class User implements Serializable {
@JsonProperty(value="prename")
@Validationinfo(name="prename", required=true, maxlenght=20)
private String m_name;
private Address m_address;
public User(String name, Address a) {
m_name = name;
m_address = a;
}
@JsonIgnore
public String getName() {
return m_name;
}
public void setName(String name) {
m_name = name;
}
public Address getAddress() {
return m_address;
}
public void setAddress(Address address) {
m_address = address;
}
}
Address.java
public class Address implements Serializable {
@JsonProperty(value="village")
@Validationinfo(name="village", required=false, maxlenght=10)
private String m_village;
public Address(String village) {
m_village = village;
}
public String getVillage() {
return m_village;
}
public void setVillage(String village) {
m_village = village;
}
}
編輯:
代碼被簡化了。 我有一個REST服務,它執行writeValue
部分。 反射部分在User
的靜態遞歸方法中完成。
問題是我在我的字段上有一個自定義的Validationinfo
注釋(包含required,maxlength等等)以及一個名稱參數。 此名稱與@JsonProperty
注釋上的名稱相同。
在JavaScript應用程序上,我想將用戶字段的值與ValidationInfos
合並。 為此,我必須確保每個validationInfos->name
都是唯一的。 因此,我必須在帶注釋的Vaditioninfo->name
的JSON序列化名稱/密鑰(請參閱REST響應“address.village”)。
我鎖定的其余響應:
{
"user": {
"prename": "Joe",
"address" : {
"village": "NY"
}
}, "validationInfos": [{
"name": "prename",
"required": true,
"maxlenght": 10
}, {
"name": "address.village",
"required": false,
"maxlenght": 20
}]
}
在JavaScript中我打算做以下事情:
for (var i = 0; i < data.validationInfos.length;; i++) {
var element = data.validationInfos;
element.value = eval ("data.user." + element.name);
}
你應該使用jackson內省而不是純java反射。 它將允許您根據序列化配置發現映射到java字段/方法的json屬性。
JavaType userType = mapper.getTypeFactory().constructType(User.class);
BeanDescription introspection =
mapper.getSerializationConfig().introspect(userType);
List<BeanPropertyDefinition> properties = introspection.findProperties();
// do some processing over properties...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.