How to use dynamic property names for a Json object

前端 未结 3 1102
悲&欢浪女
悲&欢浪女 2020-12-02 02:38

How can we make the JSON property name dynamic. For example

public class Value {
    @JsonProperty(value = \"value\")
    private String val;

    public vo         


        
相关标签:
3条回答
  • 2020-12-02 02:55

    Good question @Prasad, This answer is not about JAVA or SPRING BOOT, I'm just putting this answer because I searched to do this with node and hope this helps somebody somehow. In JAVASCRIPT we can add dynamic property names for JSON objects as below

    var dogs = {};
    
    var dogName = 'rocky';
    
    dogs[dogName] = {
        age: 2,
        otherSomething: 'something'
    };
    
    dogName = 'lexy';
    
    dogs[dogName] = {
        age: 3,
        otherSomething: 'something'
    };
    
    console.log(dogs);

    But when we need to dynamically change the name we have to

    1. get that property
    2. and create another property with the same content and new name
    3. and delete the old property from JSON
    4. assign the new property to the JSON

    is there a another way to dynamically change JSON name except for this method, thanks in advance

    0 讨论(0)
  • 2020-12-02 03:00

    You can use JsonAnySetter JsonAnyGetter annotations. Behind you can use Map instance. In case you have always one-key-object you can use Collections.singletonMap in other case use HashMap or other implementation. Below example shows how easy you can use this approach and create as many random key-s as you want:

    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;
        }
    }
    

    Above code prints:

    {"name":"Vika"}
    {"phone":"123-456-78-9"}
    {"val":"VAL!"}
    
    0 讨论(0)
  • 2020-12-02 03:04

    You could have all the possible names as variables, and annotate them so they are ignored if null. This way you only get in your JSON the one that has a value

    Then change your setter to feed into the variable mapped to the key you want.

    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;
            }
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题