Java オブジェクトを json 形式に変換してから json を Java オブジェクトに変換する際に発生する問題
````
1. 通常の状況下で
1.ファーストクラス
package com.zevin;
import com.fasterxml.jackson.annotation.JsonProperty;
public class User1 {
@JsonProperty("user_name")//把属性的名称序列化时转换为另外一个名称,即userName->user_name
private String userName;//采用驼峰命名原则
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
2. セカンドクラス
package com.zevin;
public class User2 {
private String user_name;//数据库命名规则
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
}
3. テストクラス
@Test
public void test01() throws JsonProcessingException {
//创建javaObject
User1 user1 = new User1();
user1.setUserName("zevin");
System.out.println("javaObject.userName:"+user1.getUserName()+"\n");
//创建基于"对象绑定"解析的相关API,即ObjectMapper(内置一对ObjectWriter和ObjectReader)
ObjectMapper mapper = new ObjectMapper();
//javaObject->JsonString,即调用ObjectWriter进行序列化
String JsonStringByUser1 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user1);
System.out.println("将javaObject序列化成json格式字符串:\n"+JsonStringByUser1+"\n");
//JsonString->javaObject,即调用ObjectReader进行反序列化
User2 user2 = mapper.readValue(JsonStringByUser1, User2.class);
System.out.println("将json格式字符串反序列化成javaObject:\njavaObject.user_name:"+user2.getUser_name()+"\n");
}
4. 印刷結果は正常です
1.javaObject.userName:zevin
2. javaObject を json フォーマット文字列にシリアライズします:
{ “user_name” : “zevin” } 3. json フォーマット文字列を javaObject にデシリアライズします: javaObject.user_name:zevin
````
2. パラメータ化された構築方法では、例外が発生します
1. その他は変更せず、2 番目のクラスを変更します
public class User2 {
private String user_name;//数据库命名规则
public User2(String user_name) {
this.user_name = user_name;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
}
2. 結果を出力し、逆シリアル化プロセス中に例外を表示する
- javaObject.userName:zevin
2.将javaObject序列化json格式字符串:
{ “user_name” : “zevin” } 3.com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of (ただし、少なくとも 1 つの Creator が存在します) ): [Source: (String)“{ “user_name” : “zevin” }”; 行: 2、列: 3]com.zevin.User2
3. 解決策: パラメーター化された構造体を削除するか、パラメーターのない構造体を追加します。
````
3. java オブジェクトと json の属性名が一致せず、例外が発生する
1. その他は変更せず、2 番目のクラスを変更します
package com.zevin;
public class User2 {
private String userName;//跟第一类属性名保持一致
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
2. 結果を出力し、逆シリアル化プロセス中に例外を表示する
1.javaObject.userName:zevin
2.将javaObject序列化json格式文字列:
{ “user_name” : “zevin” } 3.com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 認識されないフィールド “user_name” (class com. zevin.User2)、 [ソース: (文字列)“{ “user_name” : “zevin” }” で無視可能としてマークされていません (1 つの既知のプロパティ: “userName”]) ; 行: 2、列: 18] (参照チェーン経由: com.zevin.User2[“user_name”])
3. 解決策: setUserName メソッドを setUser_name() に変更するか、最初のクラスと一致するように @JsonProperty("user_name") を追加します。
````
4. setter メソッドを削除すると例外が発生する
1. その他は変更せず、2 番目のクラスを変更します
package com.zevin;
public class User2 {
private String user_name;//json属性名保持一致
public String getUser_name() {
return user_name;
}
//public void setUserName(String userName) {
// this.userName = userName;
//}
}
2. 結果を出力し、逆シリアル化プロセス中に例外を表示する
javaObject.userName:zevin
将javaObject序列化json格式文字列:
{ “user_name” : “zevin” } com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field “user_name” (class com.zevin.User2), not [ソース: (文字列)“{ “user_name” : “zevin” }”; 行: 2、列: 18] (参照チェーン経由: com.zevin.User2[“user_name”])
3. 解決策: セッター メソッドを追加します。メソッド名は setUser_name() にするか、@JsonProperty("user_name") を追加する必要があります。
````
5. @JsonProperty と sertter メソッドを同時に使用しますが、一貫性がありません
1. その他は変更せず、2 番目のクラスを変更します
package com.zevin;
import com.fasterxml.jackson.annotation.JsonProperty;
public class User2 {
@JsonProperty("user_name")
private String userName;//跟第一类属性名保持一致
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
2. 印刷結果が正常であることを示した後、次のケースをテストし、2 番目のクラスの変更を続行します。
package com.zevin;
import com.fasterxml.jackson.annotation.JsonProperty;
public class User2 {
@JsonProperty("userName")
private String userName;//跟第一类属性名保持一致
public String getUserName() {
return userName;
}
public void setUser_name(String userName) {
this.userName = userName;
}
}
3. 印刷結果はまだ正常です
````
結論は
1. Java オブジェクトは、次のいずれかの条件を満たす限り、正常に生成できます。
1. object プロパティの @JsonProperty の値が json プロパティ名と同じ
2.オブジェクトプロパティのsetterメソッドのメソッド名がjsonプロパティ名と同じ
つまり、Java オブジェクトの @JsonProperty("prop") または setProp() は、json の {"prop":"value"} の prop 値と一致しています。
2.特殊な場合には発生しない
1. 最初のクラスの Java オブジェクトを使用して jsonString を生成します
public class User1 {
@JsonProperty("user_name")
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
2. jsonString を使用して 2 番目のクラスの Java オブジェクトを生成します。属性名が同じであっても、エラーが報告されます。
public class User2 {
private String user_name;
public String getUserName() {
return user_name;
}
//没有@JsonProperty和setter方法
}