簡體   English   中英

如何找到字段的JSON密鑰(jackson)?

[英]How can I find the JSON key of a field (jackson)?

我有以下問題:我像往常一樣使用jackson.databind.ObjectMapper導出我的用戶對象,並且工作正常: ({"address":{"village":"NY"},"prename":"Joe"})

現在我必須使用Java反射獲取密鑰(用於addressprename )。 如果該字段具有注釋@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.

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