JSON.parseObject()は親クラスの属性を変換できません

https://juejin.im/post/5dfb76c8f265da33b313fa26

最初にビジネスシナリオを紹介します。次に、ビジネスオブジェクトの基本クラスがあります。

public class JsonRequest{
    private String msg;
    private String code;
}
复制代码

現在、それを継承し、独自のビジネスオブジェクトをもたらすNを超えるサブクラスがあります

public class DetailJsonRequest extends JsonRequest{
    private T body;
}
复制代码

シリアル番号送信オブジェクトに使用でき、マイクロサービスで使用できるこのようなオブジェクトについて考えてみてください。

そのため、ビジネスアクセプターとして、コンシューマーから送信されたリクエストを受け入れる必要があります。通常、検証と復号化の後に文字列が取得されます。ここでは、シリアル化方法をJsonと想定しています。

次に、解析した後、次のような文字列を取得しました。

    String content = "{\"body\":{\"id\":\"1123\",\"name\":\"macky\"},\"code\":\"1\",\"msg\":\"成功\"}";
复制代码

次に、必要な業種に応じて変換します。

  • 方法1:
DetailJsonRequest jsonObject = JSON.parseObject(content, DetailJsonRequest.class);
复制代码
  • 方法2:
DetailJsonRequest jsonObject = JSON.parseObject(content, new TypeReference<DetailJsonRequest<JsonContent>>(JsonContent.class) {});
复制代码

次に、効果を見てみましょう。

  • 方法1の結果:
DetailJsonRequest(body={"name":"macky","id":"1123"})
复制代码
  • 方法2の結果:
DetailJsonRequest(body=JsonContent(id=1123, name=macky))
复制代码

トリッキーなものを見つけましたか?メッセージとコードの情報がここにないので、私はショックを受けました!

ドキュメント、githubの問題などを介してさまざまな検索を行った後、原因が見つかりました-toStringメソッド

私の通常の作業では、lombokプラグインを使用してから、@ dataでデータに注釈を付けて、Bean構造を簡単に完成させます。

したがって、上記のJsonRequestとDetailJsonRequestは両方とも@dataアノテーションでハングしています。

ここで、DetailJsonRequestに別のアノテーションを追加します:@ToString(callSuper = true)

または、lombokを使用していない場合は、次のようなtoStringメソッドを使用します。

    @Override
    public String toString() {
        return "DetailJsonRequest{" +
                "body=" + body +
                ", msg='" + super.getMsg() + '\'' +
                ", code='" + super.getCode() + '\'' +
                '}';
    }
复制代码

再検証すると、両方の分析方法でメッセージとコードの情報を取得できることがわかります。

DetailJsonRequest(super=JsonRequest(msg=成功, code=1), body={"name":"macky","id":"1123"})
DetailJsonRequest(super=JsonRequest(msg=成功, code=1), body=JsonContent(id=1123, name=macky))


著者:mackyhuang
リンク:https://juejin.im/post/5dfb76c8f265da33b313fa26

おすすめ

転載: blog.csdn.net/lv842586821/article/details/107312601