簡體   English   中英

如何為 Json 對象使用動態屬性名稱

[英]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);

但是當我們需要動態更改名稱時,我們必須

  1. 得到那個財產
  2. 並創建另一個具有相同內容和新名稱的屬性
  3. 並從 JSON 中刪除舊屬性
  4. 將新屬性分配給 JSON

除了這種方法,還有另一種動態更改 JSON 名稱的方法嗎,在此先感謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM