現在、XStreamを使用してJSONを逆シリアル化していますが、うまく機能しています。ただし、次のようなJSON文字列がある場合
{
key1: { an_object: { something: 'foobar' } },
key2: { another_object: { data: 'hi' }
}
特に、ルートノードがないため、解析方法がわかりません。基本的に、逆シリアル化にはDROP_ROOT_NODEの反対が必要です。
簡単な答えは「できません」です。
XStreamは、インスタンス化するクラスを知る必要があり、JSON(またはXML)データからその知識を取得します。クラス名はエイリアス化できますが、省略できません。次の方法で回避できます。
これは古い質問ですが、午前中のグーグルで解決策を投稿します。答えは、ダミーのルートノード(開始タグと終了タグ)を提供することです。これを実現するための親友の1人はSequenceInputStreamです。
私のコードは次のとおりです。
reader = new XppDriver().createReader(new SequenceInputStream(
Collections.enumeration(Arrays.asList(
new InputStream[] {
new ByteArrayInputStream("<PlatformAuditEvents>".getBytes()),
new FileInputStream(file),
new ByteArrayInputStream("</PlatformAuditEvents>".getBytes())
}))
));
in = xstream.createObjectInputStream(reader);
ここでは、3つのInputStreamオブジェクトを混合しました。これは、処理されるファイルに必要なタグがないことを提供する1番目と3番目のオブジェクトです。
このソリューションは、このSOの質問に触発されました。これが誰かを助けることを願っています。
以下のコードを使用してください。
XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
} });