Ошибка: «объявляет несколько именованных полей JSON ...» при разборе классов со значениями getter / setter, определенными в интерфейсах - PullRequest
1 голос
/ 31 мая 2019

Рассмотрим следующие классы / интерфейсы:

interface ExampleKotlinInterface {
    val name: String
}
interface ExampleKotlinInterfaceSubclass : ExampleKotlinInterface {
    override var name: String
}
abstract class ExampleKotlinImpl(@SerializedName("name") override val name: String = "zach") : ExampleKotlinInterface
class ExampleKotlinImplSubclass(override var name: String) : ExampleKotlinImpl(name), ExampleKotlinInterfaceSubclass

, где первый интерфейс определяет значение name, а второй интерфейс расширяет его, но выставляет значение name как переменную. Я не могу разобрать ExampleKotlinImplSubclass с Gson из-за следующей ошибки:

java.lang.IllegalArgumentException: class com.example.kotlingetterinterfaceexample.ExampleKotlinImplSubclass declares multiple JSON fields named name

    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:172)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at com.google.gson.Gson.getAdapter(Gson.java:458)
    at com.google.gson.Gson.fromJson(Gson.java:926)
    at com.google.gson.Gson.fromJson(Gson.java:892)
    at com.google.gson.Gson.fromJson(Gson.java:841)
    at com.google.gson.Gson.fromJson(Gson.java:813)
    at com.example.kotlingetterinterfaceexample.ExampleGsonParseTests.testParseObject(ExampleGsonParseTests.kt:13)

используя этот тестовый код:

        val json = "{ \"name\" : \"test\" }"

        val result = Gson().fromJson(json, ExampleKotlinImplSubclass::class.java)

        assertNotNull(result)

        assertEquals("test", result.name)

Теория заключается в том, что моему суперклассу нельзя разрешать изменять значение name, но подкласс должен это делать.

Любые идеи о том, как обойти это?

Ссылка на пример проекта, показывающий эту проблему: https://github.com/ZOlbrys/kotlingetterinterfaceexample

1 Ответ

0 голосов
/ 01 июня 2019

См. Мой ответ на основе Java ответ .GSON плохо справляется с подобной ситуацией.Единственный вариант, который я вижу, это то, что вы не переопределяете поля.Что вы можете сделать - если это поможет - создать еще один уровень в ваших интерфейсах, что-то вроде:

interface ExampleKotlinInterfaceTop {
    fun getName(): String
    ...
}

interface ExampleKotlinInterface : ExampleKotlinInterfaceTop {
    val name: String
    ...
}

interface ExampleKotlinInterfaceSubclass : ExampleKotlinInterfaceTop {
    var name: String
    ...
}

Я не программист Kotlin, поэтому думаю, что в моем примере кода многое нужно исправить, нокак принцип возможного решения.

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