Как разобрать jsonObject и JsonArray для того же поля в REST Response

Существует много вариантов использования указателей.

Полиморфное поведение. Для полиморфных типов указатели (или ссылки) используются для предотвращения нарезки:

class Base { ... };
class Derived : public Base { ... };

void fun(Base b) { ... }
void gun(Base* b) { ... }
void hun(Base& b) { ... }

Derived d;
fun(d);    // oops, all Derived parts silently "sliced" off
gun(&d);   // OK, a Derived object IS-A Base object
hun(d);    // also OK, reference also doesn't slice

Ссылочная семантика и избежание копирования. Для неполиморфных типов указатель (или ссылка) избежит копирования потенциально дорогого объекта

Base b;
fun(b);  // copies b, potentially expensive 
gun(&b); // takes a pointer to b, no copying
hun(b);  // regular syntax, behaves as a pointer

. Обратите внимание, что C ++ 11 имеет семантику перемещения, которая может избежать многих копий дорогостоящих объектов в аргумент функции и как возвращаемые значения. Но использование указателя, безусловно, позволит избежать этого и позволит использовать несколько указателей на одном и том же объекте (тогда как объект может перемещаться только один раз).

Получение ресурсов. Создание указателя на ресурс с помощью оператора new является анти-шаблоном в современном C ++. Используйте специальный класс ресурсов (один из стандартных контейнеров) или интеллектуальный указатель (std::unique_ptr<> или std::shared_ptr<>). Рассмотрим:

{
    auto b = new Base;
    ...       // oops, if an exception is thrown, destructor not called!
    delete b;
}

vs.

{
    auto b = std::make_unique();
    ...       // OK, now exception safe
}

Необработанный указатель должен использоваться только как «вид» и никоим образом не связан с владением, будь то прямое создание или неявно через возвращаемые значения. См. Также этот Q & amp; A из C ++ FAQ .

Более мелкозернистый контроль времени жизни Каждый раз, когда копируется общий указатель (например, как аргумент функции), ресурс это указывает на то, что он остается в живых. Обычные объекты (не созданные new, либо непосредственно вами, либо внутри класса ресурсов) уничтожаются при выходе из области видимости.

0
задан Manish 13 July 2018 в 08:34
поделиться

2 ответа

Зарегистрированный objectMapper должен использоваться с параметром ACCEPT_SINGLE_VALUE_AS_ARRAY .

Возможно, самый простой способ добиться этого - зарегистрировать правильно инициализированные ObjectMapper и MappingJacksonHttpMessageConverter в классе аннотируется с помощью @Configuration:

@Bean
public ObjectMapper getObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enable(ACCEPT_SINGLE_VALUE_AS_ARRAY);
    return objectMapper;
}

@Bean
public MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter(ObjectMapper objectMapper) {
    MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
    converter.setObjectMapper(objectMapper);
    return converter;
}

Другой способ - установить преобразователь непосредственно на объект restTemplate:

public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enable(ACCEPT_SINGLE_VALUE_AS_ARRAY);
    return objectMapper;
}


public MappingJackson2HttpMessageConverter httpConverter(ObjectMapper objectMapper) {
    return new MappingJackson2HttpMessageConverter(objectMapper);
}

public void restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setMessageConverters(Arrays.asList(httpConverter(objectMapper())));
    restTemplate.exchange(...);
}
3
ответ дан csenga 17 August 2018 в 13:27
поделиться
  • 1
    Как я могу использовать его с моим вызовом restTemplate? можете ли вы предоставить ссылку на какой-либо пример? – Manish 13 July 2018 в 07:47
  • 2
    Просто зарегистрируйте эти компоненты в классе @Configuration в вашем контексте, и ваш restTemplate будет их использовать. – csenga 13 July 2018 в 07:49
  • 3
    но в отделе json есть и другие одиночные значения json, которые нельзя рассматривать как массив. Код, предоставленный вами, повлияет на них? обновил мою jsonString – Manish 13 July 2018 в 07:53
  • 4
    Поэтому не будет добавлено objectMapper.enable (ACCEPT_SINGLE_VALUE_AS_ARRAY); будет влиять на мой getDepartment, поскольку отдел должен быть единственным объектом. Будет ли он рассматривать отдельный объект подразделения как массив? – Manish 13 July 2018 в 07:59
  • 5
    «Будет ли он рассматривать отдельный объект подразделения как массив?» - & gt; Нет, этот параметр помогает только тогда, когда ваш класс java объявляет массив, а входящее поле json - это только объект – csenga 13 July 2018 в 08:11

JSON - это обозначение объекта javascript. JSON - это тот же синтаксис, что и javascript. В JSON значения массива должны быть типа string, array, number, object boolean или null.

-3
ответ дан fone ai 17 August 2018 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: