Ключи Enum отбрасываются при десериализации - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь десериализовать следующую структуру json в объект.

"policyDetail": {
"policies": {
    "API_KEY": {
        "isEnabled": "Yes",
        "policyEnabled": true
    },
    "BASIC_AUTH": {
        "username": "username",
        "password": "password",
        "policyEnabled": true
    }
}

}

В этой структуре API_KEY и BASIC_AUTH имеют тип java Enum. Я пытаюсь выполнить десериализацию следующим образом.

Класс обслуживания

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

SimpleModule module = new SimpleModule();
module.addDeserializer(Policy.class, new PolicyDeserializer());
mapper.registerModule(module);

PolicyDeserializer. java

publi c класс PolicyDeserializer расширяет StdDeserializer {

public PolicyDeserializer() {
    super(Policy.class);
}
protected PolicyDeserializer(Class<?> vc) {
    super(vc);
}

@Override
public Policy deserialize(JsonParser jp, DeserializationContext ctxt) 
        throws IOException, JsonProcessingException {

    ObjectMapper mapper = new ObjectMapper();
    JsonNode node = jp.readValueAsTree();

 // Here I am only getting values under API_KEY not the entire API_KEY and underneath structure.

    JsonNode customField = node.findValue("API_KEY");

    Policy result = null;

    if(customField != null && !customField.isNull()) {

        ApiKeyPolicy apiKeyPolicy = new ApiKeyPolicy();
        apiKeyPolicy = mapper.readValue(customField.toString(), ApiKeyPolicy.class);
        result = apiKeyPolicy;

        return result;
    }
    return result;
}

}

Policy. java

package model.policy;

import enums.PolicyType;

public abstract class Policy {

    private PolicyType policyType;
    private boolean isPolicyEnabled;

    public Policy(PolicyType policyType) {
        this.policyType = policyType;
    }

    /**
     * @return the isPolicyEnabled
     */
    public boolean isPolicyEnabled() {
        return isPolicyEnabled;
    }

    /**
     * @param isPolicyEnabled
     *            the isPolicyEnabled to set
     */
    public void setPolicyEnabled(boolean isPolicyEnabled) {
        this.isPolicyEnabled = isPolicyEnabled;
    }

}

ApiKeyPolicy. java

import enums.PolicyType;
import model.Policy;

public class ApiKeyPolicy extends Policy {

    private String isEnabled;

    public ApiKeyPolicy() {
        super(PolicyType.API_KEY);
    }

    /**
     * @return the isEnabled
     */
    public String getIsEnabled() {
        return isEnabled;
    }

    /**
     * @param isEnabled the isEnabled to set
     */
    public void setIsEnabled(String isEnabled) {
        this.isEnabled = isEnabled;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "ApiKeyPolicy [isEnabled=" + isEnabled + "]";
    }


}

PolicyDetail. java

import java.util.EnumMap;
import java.util.Map;

import enums.PolicyType;

public class PolicyDetail {

    EnumMap<PolicyType, Policy> policyMap = null;

    public PolicyDetail() {
        if(policyMap == null) {
            policyMap = new EnumMap<PolicyType,Policy>(PolicyType.class);
        }
    }

    public void addPolicy(PolicyType policyType, Policy policy, boolean isEnabled) {
        if(null != policy) {
            policy.setPolicyEnabled(isEnabled);
            this.policyMap.put(policyType, policy);
        }
    }

    public Map<PolicyType, Policy> getPolicies(){
        return this.policyMap;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "PolicyDetail [policyMap=" + policyMap + "]";
    }

}

Такова структура стороннего Json. Следовательно, я не могу изменить существующую структуру. Не могли бы вы подсказать, где я пропал?

Заранее спасибо ..!

1 Ответ

0 голосов
/ 08 мая 2020

После слишком долгих исследований и проб. Я обнаружил, что политика родительского абстрактного класса. java должна иметь следующие записи, например

@JsonTypeInfo(
          use = JsonTypeInfo.Id.NAME, 
          include = JsonTypeInfo.As.PROPERTY, 
          property = "type",
          visible = true
          )
        @JsonSubTypes({ 
          @JsonSubTypes.Type(value = APIKeyPolicy.class, name = "API_KEY"), 
          @Type(value = BasicAuth.class, name = "BASIC_AUTH")})

      public abstract class Policy {
        //with all methods
      }

Итак, теперь, когда я попытаюсь десериализовать это в объект, я должен получить следующие

"API_KEY": {
            "type": "API_KEY",
            "isEnabled": "Yes",
            "policyEnabled": true
        },
        "BASIC_AUTH": {
            "type": "BASIC_AUTH",
            "username": "username",
            "password": "password",
            "policyEnabled": true
        }

Но он поставляется с дополнительным свойством типа, которое на данный момент подходит. поскольку меня больше интересует имя политики ENUM с соответствующими атрибутами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...