![](/img/trans.png)
[英]How to Deserialize JSON object with dynamic variable names to a Java POJO?
[英]How to use dynamic property names for a Json object
我們如何使 JSON 屬性名稱動態化。 例如
public class Value {
@JsonProperty(value = "value")
private String val;
public void setVal(String val) {
this.val = val;
}
public String getVal() {
return val;
}
}
序列化此對象時,它被保存為{"value": "actual_value_saved"}
但我想讓密鑰也像{"new_key": "actual_value_saved"}
一樣動態。 任何幫助深表感謝。
您可以使用JsonAnySetter JsonAnyGetter注釋。 后面可以使用Map
實例。 如果你總是one-key-object
,你可以使用Collections.singletonMap
在其他情況下使用HashMap
或其他實現。 下面的示例顯示了使用這種方法並創建任意數量的隨機key
是多么容易:
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
public class JsonApp {
public static void main(String[] args) throws Exception {
DynamicJsonsFactory factory = new DynamicJsonsFactory();
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(factory.createUser("Vika")));
System.out.println(mapper.writeValueAsString(factory.createPhone("123-456-78-9")));
System.out.println(mapper.writeValueAsString(factory.any("val", "VAL!")));
}
}
class Value {
private Map<String, String> values;
@JsonAnySetter
public void put(String key, String value) {
values = Collections.singletonMap(key, value);
}
@JsonAnyGetter
public Map<String, String> getValues() {
return values;
}
@Override
public String toString() {
return values.toString();
}
}
class DynamicJsonsFactory {
public Value createUser(String name) {
return any("name", name);
}
public Value createPhone(String number) {
return any("phone", number);
}
public Value any(String key, String value) {
Value v = new Value();
v.put(Objects.requireNonNull(key), Objects.requireNonNull(value));
return v;
}
}
上面的代碼打印:
{"name":"Vika"}
{"phone":"123-456-78-9"}
{"val":"VAL!"}
您可以將所有可能的名稱作為變量,並對它們進行注釋,以便在它們為空時忽略它們。 這樣你只能在你的 JSON 中得到一個有價值的
然后更改您的設置器以輸入映射到您想要的鍵的變量。
class Value {
@JsonProperty("val")
@JsonInclude(JsonInclude.Include.NON_NULL)
private String val;
@JsonProperty("new_key")
@JsonInclude(JsonInclude.Include.NON_NULL)
private String newKey;
@JsonProperty("any_random_string")
@JsonInclude(JsonInclude.Include.NON_NULL)
private String anyRandomString;
public void setVal(String s) {
if(/* condition1 */)
this.val = s;
else if (/* condition2 */) {
this.newKey = s;
} else if (/* condition3 */) {
this.anyRandomString = s;
}
}
}
好問題@Prasad,這個答案與 JAVA 或 SPRING BOOT 無關,我只是提出這個答案,因為我搜索了用節點來做這個,希望這能以某種方式幫助某人。 在 JAVASCRIPT 中,我們可以為 JSON 對象添加動態屬性名稱,如下所示
var dogs = {}; var dogName = 'rocky'; dogs[dogName] = { age: 2, otherSomething: 'something' }; dogName = 'lexy'; dogs[dogName] = { age: 3, otherSomething: 'something' }; console.log(dogs);
但是當我們需要動態更改名稱時,我們必須
除了這種方法,還有另一種動態更改 JSON 名稱的方法嗎,在此先感謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.