Как заставить Gson читать значение как String? - PullRequest
0 голосов
/ 06 мая 2020

Мои JSON объекты выглядят так

{"phoneNbr":"123456789","firstName":"Mark","previousNames":[{"previous1":"Peter","previous2":"Steve"}]}

{"phoneNbr":"234567891","firstName":"Hank","previousNames":null}

Значения previousNames могут быть любыми. Я хочу, чтобы к нему всегда относились STRING. Однако, когда я пытаюсь разобрать его, GSON жалуется, потому что ожидает array.


PersonJsonDAO класс выглядит так

private String phoneNbr; 
private String firstName; 
private String previousNames; 

Я пытаюсь разобрать его, но GSON говорит: Expected a string but was BEGIN_ARRAY

PersonJsonDAO personJsonDAO= new Gson().fromJson(jsonString, PersonJsonDAO.class); 

Как заставить GSON принимать previousNames как String?

1 Ответ

1 голос
/ 07 мая 2020

GSON обрабатывает его как массив, потому что это действительно массив :) Я могу придумать 4 разных альтернативы для удовлетворения вашего желаемого поведения:

  1. Шаг предварительной обработки, чтобы все повернуть после '"previousNames":' в строку, выполнив поиск первого вхождения '"previousNames": [', вставив туда '"', переставив все двойные кавычки назад, до появления ']', перед которым я добавил бы еще одну двойную кавычку.

  2. гораздо более простое решение, если вы не возражаете против небольших вычислительных накладных расходов, которые в вашем случае, вероятно, крошечные, просто проанализируйте JSON как первый шаг, как и вы, но объявление previousNames как массив строк, а затем вызов:

    personJsonDAO.getString ("previousNames"); Однако это оставит вас с полем previousNames как массивом строк .

  3. Другой вариант - оставить его как JSonObject в процессе десерилизации, например: class PersonJsonDAO {.... @SerializedName ("pre viousNames ") JsonObject previousNames; ....}

  4. Если вышеперечисленных альтернатив недостаточно, и вы настаиваете на том, чтобы поле previousNames было строкой, то наиболее полным и правильным подходом было бы переопределение дезиарилизации. процесс GSON, вызывающий super для всех поведений, кроме случая, когда встречается виновник previousNames, который вы должны вернуть как String.

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