30

質問の投稿を間違えました。ここに質問を正しく投稿しています...

HTTP 応答として json 文字列を取得しています。その構造を知っています。それは次のとおりです。

public class Json<T> {
    public Hits<T> hits;
}
public class Hits<T> {
    public int found;
    public int start;
    public ArrayList<Hit<T>> hit;
}
public class Hit<T> {
    public String id;
    public Class<T> data;
}

「データ」フィールドは、どのクラスにも属することができます。私は実行時にのみそれを知っています。パラメータとして取得します。これが私がデシリアライズする方法です。

public <T> void deSerialize(Class<T> clazz) {
    ObjectMapper mapper = new ObjectMapper();
    mapper.readValue(jsonString,  new TypeReference<Json<T>>() {});
}

しかし、私はエラーが発生しています -

java.lang.class から private java.lang.class.Class() にアクセスできません。アクセス権の設定に失敗しました。java.lang.Class コンストラクターをアクセス可能にできません

4

6 に答える 6

33

JavaTypeジェネリック型が動的にしか利用できない場合は、明示的にビルドする必要があります。

// do NOT create new ObjectMapper per each request!
final ObjectMapper mapper = new ObjectMapper();

public Json<T> void deSerialize(Class<T> clazz, InputStream json) {
    return mapper.readValue(json,
      mapper.getTypeFactory().constructParametricType(Json.class, clazz));
}
于 2012-07-27T19:27:44.637 に答える
9

汎用逆シリアル化インターフェイスのサンプル:

public interface Deserializable<T> {
    static final ObjectMapper mapper = new ObjectMapper();

    @SuppressWarnings("unchecked")
    default T deserialize(String rawJson) throws IOException {
        return mapper.readValue(rawJson, (Class<T>) this.getClass());
    }
}
于 2016-01-20T13:06:35.227 に答える
2

Class オブジェクトを JSON にシリアライズおよびデシリアライズしていますか? おそらく、ヒットの文字列として保持し、Class.forName を起動する追加のゲッターを作成します。

public class Hit {
    public String id;
    public String data;
    public Class<?> getDataClass() throws Exception {
       return Class.forName(data);
    }
}
于 2012-07-26T12:22:25.887 に答える
0

私にとって、このようなものは同様のケースで機能します

public <T> T jsonToObject(String jsonContainsObject, Class<T> objectType) {
       ObjectMapper objectMapper = new ObjectMapper();
       try {
         return objectMapper.readValue(jsonContainsObject, objectType);
       } catch (JsonProcessingException e) {
         //Your exception handling
       }
    return null; 
}
于 2022-01-31T11:44:53.243 に答える
-1

ジェネリック クラス変数のデシリアライズ

...

ジャクソンにどのように伝えますか? gsonはもっとうまくやりますか?

Gson ユーザー ガイドには、達成しようとしていることを正確に理解しているセクションが含まれていますが、その文書化された例はまだ不完全な場合があります。

ブログ投稿で、Gson 1.7.1 を使用したソリューションについて詳しく説明しました。 以下は、関連するコード例です。

Jackson (1.8.2) を使用した同様の (しかしより複雑な) ソリューションも、同じブログ投稿で実証および説明されています。(さまざまなアプローチと例で数百行のコードが使用されているため、ここでの再投稿は省略しています。)

public class GsonInstanceCreatorForParameterizedTypeDemo  
{  
 public static void main(String[] args)  
 {  
  Id<String> id1 = new Id<String>(String.class, 42);  
  
  Gson gson = new GsonBuilder().registerTypeAdapter(Id.class,  
    new IdInstanceCreator()).create();  
  String json1 = gson.toJson(id1);  
  System.out.println(json1);  
  // actual output: {"classOfId":{},"value":42}  
  // This contradicts what the Gson docs say happens.  
  // With custom serialization, as described in a  
  // previous Gson user guide section,   
  // intended output may be   
  // {"value":42}  
  
  // input: {"value":42}  
  String json2 = "{\"value\":42}";  
  
  Type idOfStringType=new TypeToken<Id<String>>(){}.getType();  
  Id<String> id1Copy = gson.fromJson(json2, idOfStringType);  
  System.out.println(id1Copy);  
  // output: classOfId=class java.lang.String, value=42  
  
  Type idOfGsonType = new TypeToken<Id<Gson>>() {}.getType();  
  Id<Gson> idOfGson = gson.fromJson(json2, idOfGsonType);  
  System.out.println(idOfGson);  
  // output: classOfId=class com.google.gson.Gson, value=42  
 }  
}  
  
class Id<T>  
{  
 private final Class<T> classOfId;  
 private final long value;  
  
 public Id(Class<T> classOfId, long value)  
 {  
  this.classOfId = classOfId;  
  this.value = value;  
 }  
  
 @Override  
 public String toString()  
 {  
  return "classOfId=" + classOfId + ", value=" + value;  
 }  
}  
  
class IdInstanceCreator implements InstanceCreator<Id<?>>  
{  
 @SuppressWarnings({ "unchecked", "rawtypes" })  
 public Id<?> createInstance(Type type)  
 {  
  Type[] typeParameters =   
    ((ParameterizedType) type).getActualTypeArguments();  
  Type idType = typeParameters[0];  
  return new Id((Class<?>) idType, 0L);  
 }  
} 
于 2012-07-26T16:26:49.460 に答える