1

私は次のクラスを持っています:

public static class TestSomething {

    Integer test;

    public TestSomething(Integer test) {
        this.test = test;
    }

    // getter and setter for test
}

では、このクラスのコレクションを作成し、Gson でシリアル化します。

Collection<TestSomething> tests = Arrays.asList(
    new TestSomething(1), 
    new TestSomething(2), 
    new TestSomething(3)
);
String json = new Gson().toJson(tests, new TypeToken<Collection<TestSomething>>() {}.getType());

この後、文字列jsonはに設定されます

[{"test":1},{"test":2},{"test":3}]

これは素晴らしいことです。

しかし今、私のモデル クラスはすべて、Identifiable<T>2 つのメソッドT getId()void setId(T). だから私はTestSomething-class を上から

public static class TestSomething extends Identifiable<Long> {
    // same as above
}

これを通過させようとするとGson.toJson()、Gson は次の例外で終了します。

java.lang.UnsupportedOperationException: Expecting parameterized type, got class path.to.TestSomething.
 Are you missing the use of TypeToken idiom?
 See http://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Gener
        at com.google.gson.TypeInfoFactory.getActualType(TypeInfoFactory.java:97)
        ...

では、この仕事を得るにはどうすればよいのでしょうか。

4

2 に答える 2

0

元の質問の例が期待どおりにシリアル化されるようになったため、おそらくこの問題は、元の質問者が使用していたものよりも新しい Gson リリースの 1 つで解決されました。

// output: 
// [{"test":1},{"test":2},{"test":3}]

import java.util.Arrays;
import java.util.Collection;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class Foo
{
  public static void main(String[] args)
  {
    Collection<TestSomething> tests = Arrays.asList(
        new TestSomething(1),
        new TestSomething(2),
        new TestSomething(3));
    String json = new Gson().toJson(tests, new TypeToken<Collection<TestSomething>>() {}.getType());
    System.out.println(json);
  }
}

class TestSomething extends Identifiable<Long>
{
  Integer test;

  public TestSomething(Integer test)
  {
    this.test = test;
  }

  @Override
  Long getId()
  {
    return new Long(test);
  }

  @Override
  void setId(Long t)
  {
    this.test = (int)(t.longValue());
  }
}

abstract class Identifiable<T>
{
  abstract T getId();
  abstract void setId(T t);
}
于 2011-06-10T12:47:58.420 に答える
0

答えはわかりませんが、ジェネリック型の解決が難しいことはわかっています。具体的には、型パラメーター T を持つインターフェイスからジェネリック パラメーター宣言 (T=Long) までの完全な型解決です。このような場合、Method オブジェクトのパラメーターをチェックするだけでは十分ではなく、ジェネリック型パラメーターも解決します。これが問題の原因である可能性が最も高いです。Gson のバグかもしれません。

あなたは物事をシリアライズしているので、おそらく型宣言を省略できますか? TypeToken はユース ケースに適していますが、Gson を混乱させる可能性があります。

しかし、Gson をこれで動作させることができなかった場合に備えて、他の JSON ライブラリのJacksonがそのようなケースを正しく処理できることを私は知っています。

于 2010-11-23T01:04:10.440 に答える