1

クライアントには、エンティティで動作するJavascriptアプリケーションがあり、そのうちのいくつかは、サーバー側のインスタンスの一意のキーを含むラッパーオブジェクトで参照されます-基本的には何らかの参照です。一部は、すべてのエンティティ フィールドが存在する状態でそのまま処理されます。

サーバー上で永続化するためにエンティティを変更して送信すると、それ自体がエンティティであるフィールドの一部が参照になり、一部のフィールドが完全なオブジェクトになります。

たとえば、Car、CarModel、および Garage があるとします。受信する JSON は次のようになります。

{
    addedItems: [{
        "@class": "mydoamin.Car",
        belongsTo: {
            "key": "Unique_Garage_Key"
        },
        carModel: {
            name: "New Car Model",
            wheelSize: 14,
            doors: 5
        }
    },{
        "@class": "mydomain.Car",
        belongsTo: {
            "name": "New Garage"
        },
        carModel: {
            key: "Unique_Key_Of_Existing_Car_Model"
        }
    }]
}

これをサーバー側で機能させるには、両方の形式を対応するドメイン POJO にデシリアライズできる柔軟なデシリアライザーが必要です。

ジャクソンのドキュメントから入手したものから、デシリアライザーを開始しましたが、正しく書き込む方法の手がかりがありません。デシリアライザーにあるのは、JsonParser と DeserializationContext です。そして、最初はラッパーオブジェクトとしてストリームを2回解析し、それが失敗した場合はドメインオブジェクトとして読み取ってみることで達成できると思います。残念ながら、これが JsonParser で可能であることはわかりません。

したがって、基本的にデシリアライザーへの私のアプローチは次のとおりです。

Car car;
try { 
    Wrapper carRef = jp.readValueAs(Wrapper.class);
    car = wrapper.unwrap(carRef);
} catch (Exception e) {
    // rewind the stream somehow...
    car = jp.readValueAs(Car.class);
}

JsonParser でそれが可能で、このデシリアライゼーションのケースを達成する方法についてより良いアイデアがあるかどうか、誰かがコメントできますか?

ありがとうございました

4

1 に答える 1

1

TreeTraversingParser が問題を解決しました。

        JsonNode rootEntityNode = jp.readValueAsTree();
        TreeTraversingParser treeTraversingParser = new TreeTraversingParser(rootEntityNode, jp.getCodec());

この後、解析された JsonNode のタイプを分析し、正しいもので逆シリアル化できます。

于 2012-09-05T15:18:11.117 に答える