Java オブジェクトを json 形式に変換してから json を Java オブジェクトに変換する際に発生する問題

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. 結果を出力し、逆シリアル化プロセス中に例外を表示する

  1. 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方法
}

3. Jackson の「オブジェクト バインディング」ベースの API は、セッター メソッドと @JsonProperty の使用に関連しています。よくわからない場合は、ソース コードを参照する必要があります。

おすすめ

転載: blog.csdn.net/m0_61849361/article/details/124664854