Слияние JSON результат в java - PullRequest
1 голос
/ 04 марта 2020

У меня есть два объекта JSONObject, перечисленных ниже

ProductionCast castDetails =restTemplate.getForObject(url, ProductionCast.class);
MovieDetails movieDetails = movieDao.getDetailsOfCast(id).orElse(new MovieDetails());

//more code
return list;  //list of two objects *List<Object>*

Результат будет выглядеть так:

{"
movieId":1001,
"movieName":"Bahubali"
//little more details
}
{
"movieId":1001,
"Director":"Rajamouli"
//little more details
}

Я хочу получить результат как:

{
"movieId":1001,
"movieName":"Bahubali",
"director":"Rajamouli"
//little more details
}

Что я могу сделать, чтобы объединить результат JSON? Я хочу объединить это на основе "movieId".

Редактировать: Мой вопрос был идентифицирован как дубликат. здесь я хочу объединить объекты, которые возвращают результат в формате JSON, используя @RestController. Я не использую какие-либо JSON объекты. Надеюсь, вы поняли.

Ответы [ 3 ]

2 голосов
/ 04 марта 2020

, если вы хотите слить с другой сущностью при возврате.

вы можете попробовать @JsonUnwrapped

  public class Result{
   @JsonUnwrapped
   private ProductionCast castDetails;

   @JsonUnwrapped
   private MovieDetails movieDetails
  }

Это вернет

{
"movieId":1001,
"movieName":"Bahubali",
"director":"Rajamouli"
}

нужно внимание. @JsonUnwrapped нельзя применить к List

0 голосов
/ 08 марта 2020

Вы можете создать UNION (объединить без дубликатов), поместив все свои значения в HashMap. Любые равные ключи будут перезаписаны. Вот пример использования четырьмя различными способами (GSON, org. json, jackson-core и json -simple) для создания JSON из карты.

Здесь это рабочий образец. Я использую отражение, чтобы заполнить карту. Это может быть не то, что вы хотите.

public class Test {

  public static void main(String[] args) throws JsonProcessingException, IllegalAccessException {

    ProductionCast productionCast = new ProductionCast("1001", "Rajamouli");
    MovieDetails movieDetails = new MovieDetails("1001", "Bahubali");

    Map<String, String> map = new HashMap<>();
    fillMap(map, productionCast);
    fillMap(map, movieDetails);

    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map));

  }

  private static void fillMap(Map<String, String> map, Object object) throws IllegalAccessException {
    Field[] fields = object.getClass().getDeclaredFields();
    for(Field field:fields) {
        map.put(field.getName(), (String) field.get(object));
    }
  }

  private static class ProductionCast {
    public ProductionCast(String movieId, String director) {
        this.movieId = movieId;
        this.director = director;
    }

    public String getMovieId() {
        return movieId;
    }

    public String getDirector() {
        return director;
    }

    private String movieId;
    private String director;
  }

  private static class MovieDetails {
    private String movieId;
    private String movieName;


    public MovieDetails(String movieId, String movieName) {
        this.movieId = movieId;
        this.movieName = movieName;
    }

    public String getMovieId() {
        return movieId;
    }

    public String getMovieName() {
        return movieName;
    }
  }
}

Выход

{
  "director" : "Rajamouli",
  "movieId" : "1001",
  "movieName" : "Bahubali"
}
0 голосов
/ 04 марта 2020

Создайте класс dto с полями movieId, movieName и Director. Создайте его экземпляр с полями объектов castDetails и movieDetails выше и верните объект dto

...