Не удается преобразовать JSON (тип string) в ConcurrentHashMap - PullRequest
0 голосов
/ 14 мая 2018

Мой код выглядит следующим образом:

Сообщение класса ():

import com.google.gson.Gson;

public class Message extends Validatable {

    private static final String[] valid_commands = {"EXCHANGEKEY"};

    private final String command;
    public Message(String command){this.command = command;}
    public String getCommand() {return command;}
    @Override
        public boolean isValid() {
        for (String c : valid_commands) {
            if(c.equals(this.command))
                return true;
        }
        return false;
    }
    @Override
    public String toString() {return new Gson().toJson(this);}
}

Класс subMessage ():

import java.security.PublicKey;

import java.util.concurrent.ConcurrentHashMap;

public class subMessage extends Message{
    private final ConcurrentHashMap<String,PublicKey> keyList;
    public ExchangeKeyList(ConcurrentHashMap<String,PublicKey> keyList){
        super("EXCHANGEKEY");
        this.keyList = keyList;
    }
    public ConcurrentHashMap<String,PublicKey> getKeyList() {
        return keyList;
    }
}

Проблема в том, что после использования gson = new GSON(); и если я установлю
String JSON = gson.toJson(subMessage keyListToJson); тогда я установил subMessage keyListFromJson = gson.FromJson(JSON,subMessage.class); , он вернет ошибку. Я так растерялся, поскольку keyListToJson здесь является допустимым экземпляром subMessage, он также должен иметь возможность получить действительный экземпляр keyListFromJson. Но это по существу не, я не уверен, почему? Может кто-нибудь помочь мне, пожалуйста?

Сообщение об ошибке выглядит следующим образом:

java.lang.RuntimeException: Unable to invoke no-args constructor for interface java.security.PublicKey. Register an InstanceCreator with Gson for this type may fix this problem.
at com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:226)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:210)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:187)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
at com.google.gson.Gson.fromJson(Gson.java:887)
at com.google.gson.Gson.fromJson(Gson.java:852)
at com.google.gson.Gson.fromJson(Gson.java:801)
at com.google.gson.Gson.fromJson(Gson.java:773)
at EZShare.server.WorkerThread.processKeyExchange(WorkerThread.java:411)
at EZShare.server.WorkerThread.reception(WorkerThread.java:127)
at EZShare.server.WorkerThread.run(WorkerThread.java:70)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

Причина: java.lang.UnsupportedOperationException: Интерфейс не может быть создан! Имя интерфейса: java.security.PublicKey на com.google.gson.internal.UnsafeAllocator.assertInstantiable (UnsafeAllocator.java:117) на com.google.gson.internal.UnsafeAllocator.access $ 000 (UnsafeAllocator.java:31) на com.google.gson.internal.UnsafeAllocator $ 1.newInstance (UnsafeAllocator.java:49) на com.google.gson.internal.ConstructorConstructor $ 14.construct (ConstructorConstructor.java:223) ... еще 18

1 Ответ

0 голосов
/ 14 мая 2018

Согласно документации Gson -

Если объект, который вы сериализуете / десериализуете, является ParameterizedType (то есть содержит хотя бы один параметр типа и может быть массивом), тогда вы должны использоватьtoJson(Object, Type) или fromJson(String, Type) метод.

Таким образом, вы должны использовать следующий код для разбора json:

Type subMessageList = new TypeToken<List<subMessage>>() {}.getType();
List<subMessage> target = new LinkedList<subMessage>();
Gson gson = new Gson();
String json = gson.toJson(target, subMessageList);
List<subMessage> target2 = gson.fromJson(json, subMessageList );

Для справки - https://google.github.io/gson/apidocs/com/google/gson/Gson.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...