Преобразование массива JSON в массив Java всегда выдает пустые значения

#java #gson

Вопрос:

Итак, у меня есть эта переменная specCifDetailsReturn, которая содержит полезную нагрузку ff.

 [
{"ax21:cHType":"S",
"ax21:cardNumber":4***********7126,"ax21:returnCde":"00",
"ax21:cancelCode":"",
"ax21:vipCode":"",
"ax21:custrNbr":"0*****3426"},

{"ax21:cHType":"S",
"ax21:cardNumber":4***********3038,"ax21:returnCde":"00",
"ax21:cancelCode":"H",
"ax21:vipCode":"",
"ax21:custrNbr":"0*****3426"}
]
 

И ff. Класс модели для извлечения параметров, которые мне нужны, из массива

 @Data
@AllArgsConstructor
@NoArgsConstructor
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
public final class SpecCifInfo {

    @JsonAlias("ax21:cHType")
    private String cHType;

    @JsonAlias("ax21:cardNumber")
    private String cardNumber;

}
 

Я пытаюсь преобразовать его в список массивов Java, чтобы я мог зайти в него и найти номер карты. Но по какой-то причине он всегда выдает в журнале значение null, даже если переменная specCifDetailsReturn имеет значение. Ниже приведен фрагмент моего кода.

 Gson gson = new Gson();
Type type = new TypeToken<List<SpecCifInfo>>(){}.getType();
ArrayList<SpecCifInfo> specDetails = gson.fromJson(specCifDetailsReturn.toString(),type);

for (SpecCifInfo specInfo : specDetails){
     LOGGER.debug("Spec CIF Details", specInfo.getCHType()   "-"   specInfo.getCardNumber());
            }
 

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

Комментарии:

1. Привет, Джошуа, возможно, где-то возникла небольшая проблема. Я попробовал ваш фрагмент кода и примеры данных, и он отлично работает. Может быть, вы можете проверить версию «Gson», я использовал 2.8.8.

2. Я добавил скриншот пустого объекта SpecCifInfo,все еще пустого в журналах, даже если я перешел на 2.8.8 :/

3. Моя первая мысль: эти номера карт не могут быть действительными в формате json. Их необходимо процитировать.

Ответ №1:

Эти аннотации предназначены для библиотеки Джексона, и вы вручную используете Gson. Вы должны либо сохранить их и просто позволить Spring обрабатывать десериализацию за вас, указав List<SpecCifInfo> параметр в методе контроллера, либо использовать @SerializedName аннотацию GSON. В любом случае это сработает.

Комментарии:

1. Из двух вариантов я предлагаю отказаться от Gson, так как G, похоже, означает garbage вместо Google .

2. Хорошо отмечено , я думал, что это будет возможно с этими двумя. Я прибегнул к удалению Gson и разрешил spring десериализовать и добавил дополнительные классы моделей, чтобы указать параметры для получения полезной нагрузки. thx. Это мой код высокого уровня. ObjectMapper ObjectMapper = новый ObjectMapper(); SpecCifInfo specCifInfo = ObjectMapper.Значение чтения(specCifDetails,SpecCifInfo.class); с SpecCifInfo, имеющим подклассы для определения полезной нагрузки для каждого уровня параметров.