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