列挙型の逆/シリアル化中のこの奇妙な動作の説明を探しています

マリオケーラー

最近、JSONとの間の列挙型の逆/シリアル化中に奇妙な動作に遭遇しました。

私は関連する部分を簡単な例に落とし込みました(以下のコードを参照)。基本的に、列挙型エントリを含むリストがあります。リストをシリアル化してから、逆シリアル化します。新しい(逆シリアル化された)リストに特定の列挙型エントリが含まれている場合にチェックすると、リストに実際にエントリが含まれていても、回答として常に「false」が返されます。

少し自分で分析したところ、リストを逆シリアル化した後、コンテンツは列挙型ではなく、文字列が含まれていることがわかりました。

なぜこれが起こるのか、どうすれば回避できるのかを理解したいと思います。私の目標は、文字列のリストではなく、逆シリアル化後に列挙型エントリのリストを再度作成することです。

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import javax.json.bind.JsonbBuilder;
import javax.json.bind.JsonbConfig;

public class Test {

    enum TYPE {
        SMALL, MEDIUM, LARGE
    }

    public static void main(String[] args) {

        List<TYPE> myList = new ArrayList<>();

        myList.add( TYPE.MEDIUM );

        // serialize
        String serializedJsonString = JsonbBuilder.create(new JsonbConfig().withLocale(Locale.GERMAN).withFormatting(true)).toJson(myList);

        // deserialize
        @SuppressWarnings("unchecked")
        List<TYPE> mySecondList = JsonbBuilder.create(new JsonbConfig().withLocale(Locale.GERMAN).withFormatting(true)).fromJson(serializedJsonString, List.class);

        System.out.println( myList.contains( TYPE.MEDIUM ) );       // will be true (as expected)

        System.out.println( mySecondList.contains( TYPE.MEDIUM ) ); // will be false (surprising!)
        System.out.println( mySecondList.contains( "MEDIUM" ) );    // will be true (surprising!)
    }
}
リッチ

Java列挙型は、デフォルトで文字列にシリアル化されます。これは、Java列挙型に適したデフォルトのJSONタイプがないためです。(必要に応じて、intにシリアル化されるように構成できます。)

デシリアライズするときは、JSON文字列を列挙型に変換するようにJsonbパーサーに指示する必要があります。そうしないと、デフォルトでJavaストリングにデシリアライズされます。

上記の例では、列挙型のリストList.classList<?>)ではなく(つまりを要求したため、これを行っていませんこれは、型消去のためにJavaで行うのは難しいです。(コンパイラはバージョンが機能しないことを認識しているため、コードを「チェックなし」としてマークする必要があることに注意してください。)JsonBドキュメントでは、このケースについて明示的に説明しています:http://json-b.net/docs/user-guide .html#mapping-a-generic-collectionTYPEList<TYPE>

次のようなものを試してください:

List<TYPE> mySecondList = jsonb.fromJson(result, new ArrayList<TYPE>(){}.getClass().getGenericSuperclass());

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

注釈のない列挙型のデフォルトの列挙型(逆)シリアル化をどのように変更しますが、Jacksonで標準の動作(@ JsonProperty / @ JsonValue / ...)を保持しますか?

分類Dev

std :: joinの動作の説明を探しています

分類Dev

シェルリダイレクトインターリーブ動作の説明を探しています

分類Dev

列挙型の配列でjsonを逆シリアル化します

分類Dev

GSONの大文字と小文字を区別しない列挙型の逆シリアル化

分類Dev

Jaxrs列挙型逆シリアル化の大文字と小文字を区別しない

分類Dev

JSON文字列整数をASP.NETCoreの列挙型に逆シリアル化します

分類Dev

この奇妙な関数宣言の動作を説明できますか?

分類Dev

MariaDBのこの奇妙な動作を誰かが説明できますか?

分類Dev

null許容ブール値を逆シリアル化する際のServiceStack.Textの奇妙な動作

分類Dev

このアプリケーションの動作をどのように説明しますか?

分類Dev

serdeを使用して特定の列挙型バリアントに逆シリアル化するにはどうすればよいですか?

分類Dev

オプションの内部タグを使用して列挙型を逆シリアル化するにはどうすればよいですか?

分類Dev

GSONを使用した列挙型のカスタム逆シリアル化

分類Dev

foreachの中にプロパティを変異とき列挙の「予期しない動作」を説明

分類Dev

j2objc-列挙型を逆シリアル化するときの例外

分類Dev

ブール式の説明を探しています

分類Dev

ServiceStack.TextのEnumMember属性を使用してnull許容列挙型を逆シリアル化するにはどうすればよいですか?

分類Dev

列挙型を使用したProtobufの奇妙な動作

分類Dev

配列ソートに関するこの奇妙な動作を誰かが説明できますか?

分類Dev

Javaでの列挙型の逆シリアル化

分類Dev

RestTemplateから列挙型へのJSONの逆シリアル化

分類Dev

シリアル化を実装していない外部クレート列挙型のvecをシリアル化する

分類Dev

列挙型にdescription属性を追加し、TypeScriptでこの説明を読みます

分類Dev

WebApiが列挙型のリストを誤って逆シリアル化する

分類Dev

Protobuf-net列挙型のシリアル化の動作がver。2.3.0

分類Dev

Spring Boot JSON列挙型の逆シリアル化を厳密にして、無効な値をサイレントにnullに変換しないようにします

分類Dev

列挙型の値を使用してGsonでシリアル化する

分類Dev

特定の型の配列をxmlにシリアル化/逆シリアル化します

Related 関連記事

  1. 1

    注釈のない列挙型のデフォルトの列挙型(逆)シリアル化をどのように変更しますが、Jacksonで標準の動作(@ JsonProperty / @ JsonValue / ...)を保持しますか?

  2. 2

    std :: joinの動作の説明を探しています

  3. 3

    シェルリダイレクトインターリーブ動作の説明を探しています

  4. 4

    列挙型の配列でjsonを逆シリアル化します

  5. 5

    GSONの大文字と小文字を区別しない列挙型の逆シリアル化

  6. 6

    Jaxrs列挙型逆シリアル化の大文字と小文字を区別しない

  7. 7

    JSON文字列整数をASP.NETCoreの列挙型に逆シリアル化します

  8. 8

    この奇妙な関数宣言の動作を説明できますか?

  9. 9

    MariaDBのこの奇妙な動作を誰かが説明できますか?

  10. 10

    null許容ブール値を逆シリアル化する際のServiceStack.Textの奇妙な動作

  11. 11

    このアプリケーションの動作をどのように説明しますか?

  12. 12

    serdeを使用して特定の列挙型バリアントに逆シリアル化するにはどうすればよいですか?

  13. 13

    オプションの内部タグを使用して列挙型を逆シリアル化するにはどうすればよいですか?

  14. 14

    GSONを使用した列挙型のカスタム逆シリアル化

  15. 15

    foreachの中にプロパティを変異とき列挙の「予期しない動作」を説明

  16. 16

    j2objc-列挙型を逆シリアル化するときの例外

  17. 17

    ブール式の説明を探しています

  18. 18

    ServiceStack.TextのEnumMember属性を使用してnull許容列挙型を逆シリアル化するにはどうすればよいですか?

  19. 19

    列挙型を使用したProtobufの奇妙な動作

  20. 20

    配列ソートに関するこの奇妙な動作を誰かが説明できますか?

  21. 21

    Javaでの列挙型の逆シリアル化

  22. 22

    RestTemplateから列挙型へのJSONの逆シリアル化

  23. 23

    シリアル化を実装していない外部クレート列挙型のvecをシリアル化する

  24. 24

    列挙型にdescription属性を追加し、TypeScriptでこの説明を読みます

  25. 25

    WebApiが列挙型のリストを誤って逆シリアル化する

  26. 26

    Protobuf-net列挙型のシリアル化の動作がver。2.3.0

  27. 27

    Spring Boot JSON列挙型の逆シリアル化を厳密にして、無効な値をサイレントにnullに変換しないようにします

  28. 28

    列挙型の値を使用してGsonでシリアル化する

  29. 29

    特定の型の配列をxmlにシリアル化/逆シリアル化します

ホットタグ

アーカイブ