JAXBでのJSON配列のマッピング

1,278 views
Skip to first unread message

あゆゆん♪

unread,
May 15, 2011, 8:40:52 PM5/15/11
to jav...@googlegroups.com
いつもお世話になっています。

以下のようなJSONをJAXBを用いてJavaオブジェクトにマッピングしたいのですが
dataの下の添え字の部分がうまくマッピングできずに困っています。

{
  hoge : {
    name : データ ,
    data : {
      1 : {
         value : テスト,
    id : 1
      }

      2 : {
         value : テスト2,
    id : 2
      }

      3 : {
         value : テスト3,
    id : 3
      }
    }
  }
}

やりたいことは以下のJSONを
public class Hoge {
    private String name;
    private List<Data> dataList;←Dataの配列でも可
}

public class Data {
  private Integer id ;
  private String value;
}

のような形にマッピングしたいのですが・・・。
どなたかいい方法をご存じでしたら教えていただけると助かります。

以上。よろしくお願いいたします。


Takashi Funato

unread,
May 18, 2011, 12:24:00 PM5/18/11
to jav...@googlegroups.com
あゆゆん♪ さん
こんばんは。

tfunatoです。

JAXBはそもそも、XMLをJavaオブジェクトにマッピングするための仕様で、
JSONについては扱っていなかったと思います。

なので、単純にJSONをJavaオブジェクトにマッピングするのであれば、
JSONを扱うライブラリを使用したほうがいいかなと思います。

# JAX-RSとJAXBを使用したRESTなフレームワークでは大概JSONを扱えたりしますが。。。

上記のJSONをマッピングするサンプルを添付しました。
また、こうしたほうがいいんじゃないかという、JSONの構造のサンプルも追加してます。

JSONを扱うライブラリは幾つかあるのですが、今回はJacksonというライブラリを使用しています。
http://jackson.codehaus.org/

--
Takashi Funato

tfu...@gmail.com
http://www.canetrash.jp/
http://d.hatena.ne.jp/tfunato/

sample-json.zip

Shumpei Shiraishi

unread,
May 18, 2011, 7:34:42 PM5/18/11
to jav...@googlegroups.com
白石です。

これもたまたま、Jersey+JAXBでJSON出力を実現したことがあったので。
たしか、以下のページを参考にしました。
http://jersey.576304.n2.nabble.com/JSONJAXBContext-td4176738.html


現在ぼくの手元で動作しているコードはこちら(一年くらい前に書いたコードです)。
下のクラスをJAX-RSに食わせれば実現した、ような。
参考になれば幸いです。よろしくお願い致します。

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBContext;

import com.sun.jersey.api.json.JSONConfiguration;
import com.sun.jersey.api.json.JSONJAXBContext;

/**
*
* @author shumpei
*/
@Provider
public final class JSONJAXBContextResolver implements
ContextResolver<JAXBContext> {

private final JAXBContext context;

private final Set<Class<?>> types;

private final Class<?>[] cTypes =
{
A.class, B.class
};
public JSONJAXBContextResolver() throws Exception {
this.types = new HashSet<Class<?>>(Arrays.asList(cTypes));
this.context =
new JSONJAXBContext(JSONConfiguration.natural().build(), cTypes);
}

public JAXBContext getContext(Class<?> objectType) {
return (types.contains(objectType)) ? context : null;
}
}


2011年5月19日1:24 Takashi Funato <tfu...@gmail.com>:

> --
> このメールは Google グループのグループ「java-ja」の登録者に送られています。
> このグループに投稿するには、jav...@googlegroups.com にメールを送信してください。
> このグループから退会するには、java-ja+u...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/java-ja?hl=ja からこのグループにアクセスしてください。
>
>

あゆゆん♪

unread,
May 18, 2011, 7:54:17 PM5/18/11
to jav...@googlegroups.com
To:
tfunatoさん。
白石さん

おはようございます。あゆゆんです。
ご返信ありがとうございます。

ちょうどJAX-RS(Jersey)でJAXB連携を行っていたので教えていただいたサンプルの
ケースがマッチしそうです。
ありがとうございます。

いただいたサンプルをもとに動作検証してみます。
Reply all
Reply to author
Forward
0 new messages