Как я могу преобразовать карту в объект? - PullRequest
0 голосов
/ 03 октября 2019

Я создал Map для хранения значений всех тегов в теле SOAPMessage, чтобы ключи Map были именами узлов, а значения - текстовым содержимым. У меня есть объект, в котором у меня уже есть поля, названные в честь имен узлов, и мне нужно установить их значения в соответствии с их аналогами на карте.

Скажем, у меня есть узел с именем "Summary" в SOAPMessage, там будет ключ Map с именем "Summary", а также поле объекта с именем "Summary". Мне нужно, чтобы поле объекта "Сводка" было установлено в качестве значения Map.get ("Сводка").

Я знаю, что мог бы просто заполнить свой код сеттерами для каждого из полей, но есть лиспособ установить весь объект из карты?

Это метод, в котором я создал карту.

private static Map<String, String> mapIncidentInfo(SOAPMessage soapResponse) throws SOAPException {

    Map<String, String> fields = new HashMap<String, String>();
    NodeList nodes = soapResponse.getSOAPBody().getFirstChild().getChildNodes();

    for (int i = 0; i < nodes.getLength(); i++) {
        Node node = nodes.item(i);
        fields.put(node.getNodeName(), node.getTextContent());
    }

    return fields;
}

Это можно использовать в качестве примера класса объекта:

public class IncidentPO {

    private String Submitter;
    private String Submit_Date;
    private String Last_Modified_By;
    private String Last_Modified_Date;
    private String Status;
    private String Short_Description;

    public IncidentPO(String Submitter, String Submit_Date, String Last_Modified_By, String Last_Modified_Date, String Status, String Short_Description) {
    this.Submitter                      = Submitter;
    this.Submit_Date                    = Submit_Date;
    this.Last_Modified_By               = Last_Modified_By;
    this.Last_Modified_Date             = Last_Modified_Date;
    this.Status                         = Status;
    this.Short_Description              = Short_Description;

    //getters and setters here

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Вы можете использовать сопоставление объекта с json, а затем снова json с объектом, как показано ниже:

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class TestMap {

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
        Map<String, String> myMmap = new HashMap<>();
        myMmap.put("name", "ABC");
        myMmap.put("age", "20");
        myMmap.put("sex", "male");
        myMmap.put("city", "madhepura");
        myMmap.put("spec", "java");

        ObjectMapper mapper = new ObjectMapper();
        ObjectNode objectNode1 = mapper.createObjectNode();
        for(String key : myMmap.keySet()) {
            objectNode1.put(key, myMmap.get(key));
        }
        // take the value of objectNode1.toString() and create a pojo from http://www.jsonschema2pojo.org/
        Person person = mapper.readValue(objectNode1.toString().getBytes(), Person.class);
        System.out.println(person);
    }

}

// вы можете использовать http://www.jsonschema2pojo.org для получения POJO из objectNode1.toString ()

// {"city": "patna", "sex": "male", "name": "ABC", "age": "20", "spec": "java"}

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"city",
"sex",
"name",
"age",
"spec"
})
class Person {

@JsonProperty("city")
private String city;
@JsonProperty("sex")
private String sex;
@JsonProperty("name")
private String name;
@JsonProperty("age")
private String age;
@JsonProperty("spec")
private String spec;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("city")
public String getCity() {
return city;
}

@JsonProperty("city")
public void setCity(String city) {
this.city = city;
}

@JsonProperty("sex")
public String getSex() {
return sex;
}

@JsonProperty("sex")
public void setSex(String sex) {
this.sex = sex;
}

@JsonProperty("name")
public String getName() {
return name;
}

@JsonProperty("name")
public void setName(String name) {
this.name = name;
}

@JsonProperty("age")
public String getAge() {
return age;
}

@JsonProperty("age")
public void setAge(String age) {
this.age = age;
}

@JsonProperty("spec")
public String getSpec() {
return spec;
}

@JsonProperty("spec")
public void setSpec(String spec) {
this.spec = spec;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}
0 голосов
/ 03 октября 2019

Нет простого способа (без библиотек) преобразовать карту в объект. Прямым вариантом является предоставление карты в конструкторе и ее заполнение.

public IncidentPO(Map<String, String> map) {
    this.Submitter = map.get("Submitter");
    this.Submit_Date = map.get("Submit_Date");
    // etc
}
...