web-dev-qa-db-ja.com

JSONをレスポンススプリングブートとして返す

残りの応答をjsonとして取得しようとしていますが、代わりに文字列として取得しています。

コントローラ

@RestController
@RequestMapping("/api/")
public class someController{

  @Autowired
  private SomeService someService;

  @GetMapping("/getsome")
  public Iterable<SomeModel> getData(){
    return someService.getData();
  }
}

サービス

@Autowired
private SomeRepo someRepo;

public Iterable<someModel> getData(){
  return someRepo.findAll();
}

リポジトリ

public interface SomeRepo extends CrudRepository<SomeModel,Integer>{

}

モデル

@Entity
@Table(name="some_table")
public class SomeModel{

  @Id
  @Column(name="p_col", nullable=false)
  private Integer id;
  @Column(name="s_col")
  private String name
  @Column(name="t_col")
  private String json;   // this column contains json data

  //constructors, getters and setters
}

localhost:8080/api/getsomeを実行すると、次のようになります:

[
 {
    "p_col":1,
    "s_col":"someName",
    "t_col":" 
{\r\n\t"school_name\":\"someSchool\",\t\r\n\t"grade\":"A\",\r\n\t\"class\": 
 [{\"course\":"abc",\t"course_name\":\"def" }]}"
  }
]

フィールドt_colがjsonではなく文字列を返しています。応答としてjsonオブジェクトを取得するにはどうすればよいですか?

データベースに関しては、3つの列はint、varchar、およびvarcharです。

任意の助けいただければ幸いです。ありがとう!!

4
404or505

Json属性をJsonNodeとして定義する必要があります。これにより、Jacksonはそれを読み戻すことができますが、マークは@Transientであるため、JPAはデータベースに保存しようとしません。

次に、JPAのgetter/setterをコーディングし、JsonNodeからStringに変換して前後に変換できます。 JsonNode jsongetJsonStringに変換するゲッターStringを定義します。これは「json_string」などのテーブル列にマップできます。次に、JPAからStringを受け取るセッターを定義し、それをJsonNodeに解析して、Jacksonで使用できるようにします。あなたが言うように、jsonオブジェクトは文字列ではありません。

@Entity
@Table(name = "model")
public class SomeModel {

  private Long id;
  private String col1;

  //  Attribute for Jackson 
  @Transient
  private JsonNode json;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  public Long getId() {
    return id;
  }

  @Column(name ="col1")
  public String getCol1() {
    return col1;
  }

  // Getter and setter for name

  @Transient
  public JsonNode getJson() {
    return json;
  }

  public void setJson(JsonNode json) {
    this.json = json;
  }

  // Getter and Setter for JPA use
  @Column(name ="jsonString")
  public String getJsonString() {
    return this.json.toString();
  }

  public void setJsonString(String jsonString) {
    // parse from String to JsonNode object
    ObjectMapper mapper = new ObjectMapper();
    try {
      this.json = mapper.readTree(jsonString);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

@Columnはゲッターで定義されています。JPAがgetJsonStringを使用することを示す必要があり、JPAは一貫性を必要とするため、すべての列のゲッターに@Columnsを付ける必要があります。

1
  @RequestMapping(value = "/getsome", method = RequestMethod.POST, consumes = 
  "application/json;")
 public @ResponseBody
  ModelAndView getSome(@RequestBody List<Map<String, String>> request) {
 request.stream().forEach(mapsData->{
    mapsData.entrySet().forEach(mapData -> {
      System.Out.Println("key :"+mapData.getKey() + " " + 
        " value : " +mapData.getValue());
    });
  }
});
return new ModelAndView("redirect:/home");

}

0
user

DBの回答をfindAllから(List of Sometype)のようなオブジェクトタイプのリストにキャストし、データを返します。これで問題が解決します。

0