質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

12002閲覧

Jacksonで基本的な型タイプが自動でシリアライズ出来ない

shichiria

総合スコア33

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/10/12 02:57

ArrayList<String>型をJsonに変換したくてJacksonを使っているのですが、
サンプルを見ながら下記のようなコードを作ってみたのですがうまく動きません。

lang

1 List<String> list = new ArrayList<>(); 2 for(int i=0; i<100; i++) { 3 list.add("test" + Integer.toString(i)); 4 } 5 6 ObjectMapper mapper = new ObjectMapper(); 7 SimpleModule simpleModule = new SimpleModule(); 8 simpleModule.addSerializer(String.class, new StringSerializer()); 9 mapper.registerModule(simpleModule); 10 String json = mapper.writeValueAsString(list); 11 12 System.out.println(json);

出力されるエラー:
Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.JavaType.isReferenceType()Z・・・

一応下記のように、Module登録すれば動くのはわかったのですが、
いちいちこんな登録をするのが面倒な上、
一つでも登録を忘れれば、エラーが起きてしまいます。

lang

1 List<String> list = new ArrayList<>(); 2 for(int i=0; i<100; i++) { 3 list.add("test" + Integer.toString(i)); 4 } 5 6 ObjectMapper mapper = new ObjectMapper(); 7//追加部分(StringSerializerはJacksonのデフォルトのもの) 8 SimpleModule simpleModule = new SimpleModule(); 9 simpleModule.addSerializer(String.class, new StringSerializer()); 10 mapper.registerModule(simpleModule); 11//ここまで 12 String json = mapper.writeValueAsString(list); 13 14 System.out.println(json);

そもそも、ネット上のサンプルはこんなことせずに動いています。
何かしら私の設定に見落としがあるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1つ目のコードを実行してみましたが、エラーは出ませんでした。

ObjectMapperなどjackson-databindに含まれるクラスをimportできているのにNoSuchMethodErrorが出るということは、jackson-databindのバージョンが古いのかもしれません。
コードだけではなく利用されているライブラリのバージョンも確認してみてください。

以下、私の環境とGradleのbuild.gradle、Javaのコードです。

text

1java version "1.8.0_45" 2Java(TM) SE Runtime Environment (build 1.8.0_45-b14) 3Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

依存ライブラリ

  • jackson-annotation:2.6.0
  • jackson-core:2.6.2
  • jackson-databind:2.6.2

build.gradle

groovy

1apply plugin: 'java' 2 3sourceCompatibility = 1.8 4 5repositories { 6 mavenCentral() 7} 8 9dependencies { 10 compile 'com.fasterxml.jackson.core:jackson-databind:2.6.2' 11}

Jackson.java

java

1import com.fasterxml.jackson.core.JsonProcessingException; 2import com.fasterxml.jackson.databind.ObjectMapper; 3import com.fasterxml.jackson.databind.module.SimpleModule; 4import com.fasterxml.jackson.databind.ser.std.StringSerializer; 5 6import java.util.ArrayList; 7import java.util.List; 8 9public class Jackson { 10 public static void main(String[] args) throws JsonProcessingException { 11 List<String> list = new ArrayList<>(); 12 for (int i = 0; i < 100; i++) { 13 list.add("test" + Integer.toString(i)); 14 } 15 16 ObjectMapper mapper = new ObjectMapper(); 17 SimpleModule simpleModule = new SimpleModule(); 18 simpleModule.addSerializer(String.class, new StringSerializer()); 19 mapper.registerModule(simpleModule); 20 String json = mapper.writeValueAsString(list); 21 22 System.out.println(json); 23 } 24}

投稿2015/10/12 04:55

shiena

総合スコア1825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shichiria

2015/10/12 05:30

すみません、最初のコードが間違っていました。 下記が正しい(動かなかった)コードです。(SimpleModuleの登録なし) >ObjectMapper mapper = new ObjectMapper(); >String json = mapper.writeValueAsString(list); ただ、回答の通り、 バージョンを下記のように変更することで、 上記コードでも問題なく動作するようになりました。 ありがとうございます。 jackson-annotation:2.6.0(変更なし) jackson-core:2.5.0→jackson-core:2.6.3 jackson-databind:2.6.0→jackson-databind:2.6.3
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問