Nano Hash - криптовалюты, майнинг, программирование

Создать объект из строки Gson не работает

Я хочу передать объект в пакет. Теперь я сделал преобразование в объект Json с помощью GSON.

Пакет передан, пакет имеет правильное строковое представление, но когда я создаю объект из строки, я получаю огромную ошибку.

FATAL EXCEPTION: main
    java.lang.RuntimeException: Failed to invoke private android.net.Uri() with no args
            at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:107)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:162)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
            at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
            at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
            at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
            at com.google.gson.Gson.fromJson(Gson.java:803)
            at com.google.gson.Gson.fromJson(Gson.java:768)
            at com.google.gson.Gson.fromJson(Gson.java:717)
            at com.google.gson.Gson.fromJson(Gson.java:689)
            at com.test.fragment.QFragment.onCreateView(QFragment.java:54)
            at android.app.Fragment.performCreateView(Fragment.java:1788)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:899)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1101)
            at android.app.BackStackRecord.run(BackStackRecord.java:688)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1559)
            at android.app.FragmentManagerImpl$1.run(FragmentManager.java:445)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:158)
            at android.app.ActivityThread.main(ActivityThread.java:5789)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:843)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.InstantiationException: can't instantiate class android.net.Uri
            at java.lang.reflect.Constructor.constructNative(Native Method)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
            at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:104)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:162)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
            at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
            at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
            at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
            at com.google.gson.Gson.fromJson(Gson.java:803)
            at com.google.gson.Gson.fromJson(Gson.java:768)
            at com.google.gson.Gson.fromJson(Gson.java:717)
            at com.google.gson.Gson.fromJson(Gson.java:689)
            at com.test.fragment.QFragment.onCreateView(QFragment.java:54)
            at android.app.Fragment.performCreateView(Fragment.java:1788)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:899)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1101)
            at android.app.BackStackRecord.run(BackStackRecord.java:688)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1559)
            at android.app.FragmentManagerImpl$1.run(FragmentManager.java:445)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:158)
            at android.app.ActivityThread.main(ActivityThread.java:5789)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:843)
            at dalvik.system.NativeStart.main(Native Method)

Я делаю преобразование следующим образом:

public static QFragment newInstance(FModel oModel) {
    QFragment fragment = new QFragment();
    fragment.mOModel = oModel;
    Bundle bdl = new Bundle();
    bdl.putString("oModel", new Gson().toJson(oModel));
    fragment.setArguments(bdl);
    return fragment;
}

и в моем фрагменте на createView:

 String jsonMyObject = null;
        Bundle args = this.getArguments();
        if (args != null) {
            jsonMyObject = args.getString("oModel");
        }
        mOrderModel = new Gson().fromJson(jsonMyObject, FModel.class);

Каков наилучший способ исправить это? Нужно ли мне переходить на сериализуемый или разделяемый?

20.03.2014

  • Вы делаете это правильно, проблема в другом месте. Вызвано: java.lang.InstantiationException: невозможно создать экземпляр класса android.net.Uri, или ваши переменные класса модели имеют имена, отличные от ключей json? Но обычно для меня это дает null при ссылке на значение геттера, а не на ошибку... 20.03.2014
  • У меня нет класса android.net.Uri? 20.03.2014
  • Было бы полезно увидеть соответствующие ctors и свойства и т. д. в вашем классе FModel. 20.03.2014
  • Есть ли в Fmodel поле Android.net.Uri? Android.net.Uri является абстрактным, по определению не может быть создан. 20.03.2014
  • По сути, это то, о чем мы все догадывались, но ОП не опубликовал код !!!! В любом случае молодец ОП. 20.03.2014
  • Вы также можете использовать BundleTypeAdapter, как описано здесь: github.com/google-gson/typeadapters/blob/master/android/src/ 25.03.2015

Ответы:


1

Нашел проблему в FModel там действительно был Uri.

Решил это, написав:

public class UriSerializer implements JsonSerializer<Uri> {
    public JsonElement serialize(Uri src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.toString());
    }
}

public class UriDeserializer implements JsonDeserializer<Uri> {
    @Override
    public Uri deserialize(final JsonElement src, final Type srcType,
                           final JsonDeserializationContext context) throws JsonParseException {
        return Uri.parse(src.getAsString());
    }
}

и выполняя преобразование Gson следующим образом:

Gson gson = new GsonBuilder()
                .registerTypeAdapter(Uri.class, new UriSerializer())
                .create();
        bdl.putString("oModel",gson.toJson(oModel));

и в oncreate, чтобы перестроить это:

Gson gson = new GsonBuilder()
                    .registerTypeAdapter(Uri.class, new UriDeserializer())
                    .create();
            jsonMyObject = args.getString("oModel");
            mOrderModel = gson.fromJson(jsonMyObject, FModel.class);
20.03.2014
  • Спасибо за это, действительно полезно, но у меня все еще есть вопрос. Что происходит, когда ваш объект, который вы сохраняете как JSON, иногда имеет параметр URI, установленный на null? В этом случае при попытке записи будет выдано исключение. Я пытался проверить значение null, но потом получаю другую ошибку. Любые идеи? 05.02.2016

  • 2

    К вашему сведению, вы можете одновременно использовать сериализацию и десериализацию, объединив две реализации интерфейсов в один класс.

    public class UriInOut implements JsonSerializer<Uri>, JsonDeserializer<Uri> {
      @Override
      public JsonElement serialize(Uri src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.toString());
      }
    
      @Override
      public Uri deserialize(final JsonElement src, final Type srcType,
                             final JsonDeserializationContext context) throws JsonParseException {
        return Uri.parse(src.getAsString());
      }
    }
    ....
    new GsonBuilder()   
        .registerTypeAdapter(Uri.class, new UriInOut())
        .create();
    
    30.12.2014
  • изменить src.getAsString() на src.toString() 27.06.2017

  • 3

    Вы также можете использовать TypeAdapter, который более эффективен.

    public final class UriAdapter extends TypeAdapter<Uri> {
      @Override 
      public void write(JsonWriter out, Uri uri) throws IOException {
        out.value(uri.toString());
      }
    
      @Override 
      public Uri read(JsonReader in) throws IOException {
        return Uri.parse(in.nextString());
      }
    }
    
    04.09.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..