Как десериализовать поле во вложенном массиве - PullRequest
2 голосов
/ 09 июля 2020

У меня проблема с получением одного из полей во вложенном массиве.

Сначала я пытаюсь перебрать root массив моего json вот так -

                for(SearchHit h : hits){
                    String source = h.getSourceAsString().replace("null","\"\"");
                    
                    TestResponse svcResp = mapper.readValue(source, TestResponse.class);
                    dataResp.add(svcResp);
                }

Теперь исходный код json будет выглядеть так -

 {

  "name": [
    {
      "family": "Doe",
      "given": "Jon",
      "middle": "Smith",
      "use": "Commercial"
    }
  ]
}

, а мой pojo будет выглядеть так -

private String fstNm;
List<Map<String,Object>> name=null;
private List<Map<String,Object>> name;

public String getFstNm() { return fstNm; }


public void setFstNm(List<Map<String, Object>> hits) {

      name = (List) hits.get(0).get("name");

      this.fstNm= (String) name.get(0).get("given");
        

}

Мой ожидаемый результат -

{
    "fstNm":"Jon"
}

Но я получаю фактический результат -

{
    "fstNm":null,
    "name": [
          {
            "family": "Doe",
            "given": "Jon",
            "middle": "Smith",
            "use": "Commercial"
          }
        ]

   }

Как мне заставить работать ожидаемый результат?

Обновить публикацию всего моего pojo -

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
import java.util.Map;
import java.util.List;

@AllArgsConstructor
@Setter
@Getter
public class TestResponse {

    @JsonProperty("dummyID")
    @JsonAlias("dummyID")
    private String dummyID;

 


    private String fstNm;


    private List<Map<String, Object>> name;

    public String getFstNm() {
        return fstNm;
    }

    public void setFstNm(String fstNm) {
        this.fstNm=fstNm;

    }


    public List<Map<String, Object>> getName() {
        return name;
    }

    public void setName(List<Map<String, Object>> name) {
        this.name = name;
        this.fstNm= (String) name.get(0).get("given");
    }

    public String getdummyId() {
        return dummyId;
    }

    public void setdummyId(String dummyId) {
        this.dummyId = dummyId;
    }
}
    

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Вы можете просто установить fstName внутри метода setName, поскольку свойство name будет проанализировано.

Не комментируя, правильно вы это делаете или нет. Просто разместите простое решение, которое будет работать, и, конечно же, есть много других способов достижения этого, например, пользовательский десериализатор et c.

public class Test {

    @org.junit.Test
    public void test() throws JsonMappingException, JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();
        String input = "{\r\n" + "\r\n" + "  \"name\": [\r\n" + "    {\r\n" + "      \"family\": \"Doe\",\r\n"
                + "      \"given\": \"Jon\",\r\n" + "      \"middle\": \"Smith\",\r\n"
                + "      \"use\": \"Commercial\"\r\n" + "    }\r\n" + "  ]\r\n" + "}";
        System.out.println(input);

        System.out.println(mapper.readValue(input, TestResponse.class));
    }
    
    @JsonIgnoreProperties(ignoreUnknown = false)
    @JsonPropertyOrder({"name", "fstNm" })
    protected static class TestResponse {

        private String fstNm;
        
        
        private List<Map<String, Object>> name;

        public String getFstNm() {
            return fstNm;
        }

        public void setFstNm(String fstNm) {
            this.fstNm=fstNm;

        }       
        

        public List<Map<String, Object>> getName() {
            return name;
        }

        public void setName(List<Map<String, Object>> name) {
            this.name = name;
            this.fstNm= (String) name.get(0).get("given");
        }

        @Override
        public String toString() {
            return "Pojo [fstNm=" + fstNm + ", name=" + name + "]";
        }
        
        

    }
}

Вывод:

{

  "name": [
    {
      "family": "Doe",
      "given": "Jon",
      "middle": "Smith",
      "use": "Commercial"
    }
  ]
}
Pojo [fstNm=Jon, name=[{family=Doe, given=Jon, middle=Smith, use=Commercial}]]
0 голосов
/ 09 июля 2020

Просто предложение: почему бы вам не использовать Map<String, Object> source = h.getSourceAsMap(); вместо анализа JSON с помощью Mapper?

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