私はデータベースにjsonファイルを保存するいくつかの方法を試しましたが、エントリごとに異なる列を作成してしまいます。
「json」タイプとして1つの列に格納したい。出来ますか?
私のjsonファイル。
users.json
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "[email protected]",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
},
...
]
これはスプリングブートアプリケーションであり、関連するコントローラーとサービスがあります。
私のドメインパッケージ。(住所と会社は埋め込み可能なクラスです)
User.java
@Data
@AllArgsConstructor @NoArgsConstructor
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private String username;
private String email;
private String phone;
private String website;
@Embedded
private Address address;
@Embedded
private Company company;
}
メインファイル(データベースに保存)
TypeReferenceとObjectMapperはジャクソンからのものです
@SpringBootApplication
public class JsondbApplication {
public static void main(String[] args) {
SpringApplication.run(JsondbApplication.class, args);
}
@Bean
CommandLineRunner runner(UserService service) {
return args -> {
ObjectMapper mapper = new ObjectMapper();
TypeReference<List<User>> reference = new TypeReference<List<User>>() {};
InputStream stream = TypeReference.class.getResourceAsStream("/json/users.json");
try {
List<User> users = mapper.readValue(stream, reference);
service.save(users);
System.out.println("Saved!");
} catch (Exception h) {
System.out.println("Unable to save! " + h.getMessage());
}
};
}
}
mysqlでは、異なる列を作成します id, name, username, ...
スプリングブーツを使ったタイプで一列に収納したいですjson
。
コードはjsonをUser
オブジェクトのリストに読み込み、データベースに永続化します。それをjsonとして保存するには、カスタムロジックを記述する必要があります。それを行うには複数の方法があります。
あなたは次のようなことができます
1)User
クラスに別の変数を追加するprivate String jsonData
2)@PrePersist
メソッドで、シリアル化ロジックを記述します
3)@JsonInclude()
ジャクソンに含める @Transient
-別の列の永続化で無視する-で他の属性をマークします。id
各jsonオブジェクトはデータベースの特定のIDに対して保存されるため、これらの注釈を属性に追加したくない場合があります。
したがって、新しい属性は次のようになります
@NonNull
@Column(columnDefinition = "JSON") // Only if Database has JSON type else this line can be removed
private String jsonData;
PrePersist:
@PrePersist
public void prePersist() {
try {
this.setJsonData(new ObjectMapper().writeValueAsString(this));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
編集:メソッドで@Transient
属性がnullであるという問題に直面する可能性があります@PrePersist
。その場合は、setterメソッドを使用できます。ただし、save呼び出しの前に属性が変更されるたびに、このセッターを呼び出す必要があります。
public void setJsonData(String jsonData) {
// Method parameter jsonData is simply ignored
try {
this.jsonData = new ObjectMapper().writeValueAsString(this);
} catch (JsonProcessingException e) {
log.error(e.getMessage());
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加