Строка JSON не может быть преобразована в массив / ArrayList - PullRequest
0 голосов
/ 04 июля 2019
[
    {
        countryCode: "CN",
        countryCallingCode: "+86",
        codeRule: "^1\d{10}$"
    },
    {
        countryCode: "US",
        countryCallingCode: "+1",
        codeRule: "^\d{10}$"
    }
]

Итак, я определяю модель следующим образом в Kotlin

data class CountryCallingCode(
        val countryCode: String,
        val countryCallingCode: String,
        val codeRule: String? = null
)

Это то, что внутренний документ определяет ответ. codeRule - это выражение регулярного выражения для подтверждения номера телефона.

Я застрял в преобразовании строки в список.

Я вставил их в Android Studio, и это показывает как:

String response = "[\n" +
        "    {\n" +
        "        countryCode: \"CN\",\n" +
        "        countryCallingCode: \"+86\",\n" +
        //"        codeRule: \"^1\\d{10}$\"\n" +
        "    },\n" +
        "    {\n" +
        "        countryCode: \"US\",\n" +
        "        countryCallingCode: \"+1\",\n" +
        //"        codeRule: \"^\\d{10}$\"\n" +
        "    }\n" +
        "]";

Следующие коды не работают.

Преобразование кода 1:

Gson gson = new Gson()
CountryCallingCode[] countryCallingCodeList = gson.fromJson(response, CountryCallingCode[].class);

И я думаю, что следующие коды одинаковы, поправьте меня, если я ошибаюсь.

Преобразование кода 2:

ArrayList<CountryCallingCode> countryCallingCodeList = (ArrayList<CountryCallingCode>)gson.fromJson(response, ArrayList.class);

Преобразование кода 3

Gson gson = new Gson();
        Type type = new TypeToken<List<CountryCallingCode>>() {
        }.getType();
        List<CountryCallingCode> countryCallingCodeList = gson.fromJson(response, type);

Затем я использую https://jsoneditoronline.org/, чтобы переформатировать мой JSON.

JsonString with codeRule online check error JsonString without codeRule online check error

Я попытался удалить codeRule и вставил его в Android Studio, он также говорит мне, что я не прав, он показывает, что CountryCode вызывает SyntaxException.

    String reponse = "[\n" +
            "    {\n" +
            "        countryCode: \"CN\",\n" +
            "        countryCallingCode: \"+86\"\n" +
            "    },\n" +
            "    {\n" +
            "        countryCode: \"US\",\n" +
            "        countryCallingCode: \"+1\"\n" +
            "    }\n" +
            "]";

Только я сжимаю jsonstring в oneline, я могу преобразовать jsonstring в массив / ArrayList.

String response = "[{\"countryCode\":\"CN\",\"countryCallingCode\":\"+86\"},{\"countryCode\":\"US\",\"countryCallingCode\":\"+1\"}]";

Кто-нибудь знает

  • 1:

Как бороться с codeRule?

  • 2:

Почему я не смог вставить исходную JsonString в Android Studio?

Почему я должен сжимать JsonString в одну строку?

Обновлен:

Исходная строка json:

[{"countryCode":"CN","countryCallingCode":"+86", codeRule: "^1\d{10}$"},{"countryCode":"US","countryCallingCode":"+1", codeRule: "^\d{10}$"}] 

Вставленный результат json string:

String response = "[{\"countryCode\":\"CN\",\"countryCallingCode\":\"+86\", codeRule: \"^1\\d{10}$\"},{\"countryCode\":\"US\",\"countryCallingCode\":\"+1\", codeRule: \"^\\d{10}$\"}]";

Код:

Gson gson = new Gson();

/* Convertion 1 */
CountryCallingCode[] countryCallingCodeList = gson.fromJson(response, CountryCallingCode[].class);

Ошибка:

result = {JsonSyntaxException@7237} Method threw 'com.google.gson.JsonSyntaxException' exception.
 cause = {MalformedJsonException@7241} "com.google.gson.stream.MalformedJsonException: Invalid escape sequence at line 1 column 65 path $[0].codeRule"
 detailMessage = "com.google.gson.stream.MalformedJsonException: Invalid escape sequence at line 1 column 65 path $[0].codeRule"
 stackState = null
 stackTrace = {StackTraceElement[28]@7243} 
 suppressedExceptions = {Collections$EmptyList@7244}  size = 0
 shadow$_klass_ = {Class@1694} "class com.google.gson.JsonSyntaxException"
 shadow$_monitor_ = -2082115852

1 Ответ

0 голосов
/ 04 июля 2019

Это больше комментарий, чем ответ, но мне нужно больше места для объяснения - если ваша версия Java поддерживает его, вы можете попробовать создать свой ответ с необработанной строкой, подобной этой:

String response = `[
    {
        countryCode: "CN",
        countryCallingCode: "+86",
        codeRule: "^1\d{10}$"
    },
    {
        countryCode: "US",
        countryCallingCode: "+1",
        codeRule: "^\d{10}$"
    }
]`

Или, если возможно, используйте Kotlin, который использует """ для разделения необработанных строк.Это будет намного более читабельным и поможет вам обнаружить ошибки

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