Как преобразовать объект Java (боб) в пары "ключ-значение" (и наоборот)?

С помощью %3c можно сканировать три символа. Это не завершает массив нулем, поэтому нельзя использовать ни одну из строковых функций, ожидающих этот нулевой терминатор. Спецификатор %n возвращает количество символов, обработанных при сканировании.
Печать можно выполнить, ограничив количество символов с помощью поля точности в %.3s

#include <stdio.h>
#include <stdlib.h>

int main( void) {

    char str[]="ABCDEFGHIJKL";
    int count = 0;
    int span = 0;
    int used = 0;
    char arr[6][3]={};

    while ( count < 6 && 1 == sscanf ( str + span, "%3c%n", &arr[count][0], &used)) {
        count++;
        span += used;//accumulate number of scanned characters
    }

    while ( count) {
        count--;
        printf ( "%.3s\n", arr[count]);//print up to three characters
    }

    return 0;
}
89
задан M-Razavi 6 December 2016 в 08:09
поделиться

9 ответов

Всегда есть apache commons beanutils , но, конечно, он использует отражение под капотом

51
ответ дан Maurice Perry 24 November 2019 в 07:10
поделиться

Вы должны написать универсальный Сервис преобразования! Используйте дженерики, чтобы сохранить тип свободным (чтобы вы могли преобразовать каждый объект в ключ => значение и обратно).

Какое поле должно быть ключом? Получите это поле из компонента и добавьте любое другое непереходное значение в карту значений.

Путь назад довольно легкий. Прочитайте ключ (x) и запишите сначала ключ, а затем каждую запись в списке обратно в новый объект.

1
ответ дан Martin K. 24 November 2019 в 07:10
поделиться

Мой JavaDude Bean Annotation Processor генерирует код для этого.

http://javadude.googlecode.com

Например:

@Bean(
  createPropertyMap=true,
  properties={
    @Property(name="name"),
    @Property(name="phone", bound=true),
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
  }
)
public class Person extends PersonGen {}

Выше генерируется суперкласс PersonGen, который включает метод createPropertyMap (), который генерирует Map для всех свойств, определенных с помощью @Bean.

(Примечание что я немного изменю API для следующей версии - атрибут аннотации будет defineCreatePropertyMap = true)

1
ответ дан Scott Stanchfield 24 November 2019 в 07:10
поделиться

Если вы не хотите жестко кодировать вызовы для каждого метода получения и установки, отражение - единственный способ вызвать эти методы ( но это не сложно).

Можете ли вы провести рефакторинг рассматриваемого класса, чтобы использовать объект Properties для хранения фактических данных, и позволить каждому получателю и установщику просто вызывать get / set для него? Тогда у вас есть структура, хорошо подходящая для того, что вы хотите сделать. Есть даже методы для сохранения и загрузки их в форме ключ-значение.

2
ответ дан Thorbjørn Ravn Andersen 24 November 2019 в 07:10
поделиться

JSON , например, использующий XStream + Jettison, представляет собой простой текстовый формат с парами ключ-значение. Он поддерживается, например, брокером сообщений Apache ActiveMQ JMS для обмена объектами Java с другими платформами / языками.

3
ответ дан mjn 24 November 2019 в 07:10
поделиться

Генерация кода была бы единственным способом, о котором я могу думать. Лично я получил решение для многократного использования отражений (если только эта часть кода не критична для производительности). Использование JMS звучит как излишнее (дополнительная зависимость, и это даже не то, для чего она предназначена). Кроме того, он, вероятно, использует отражение под капотом.

8
ответ дан Michael Borgwardt 24 November 2019 в 07:10
поделиться

Вы могли бы использовать фреймворк Joda:

http: //joda.sourceforge. net /

и воспользуйтесь JodaProperties. Однако это оговаривает, что вы создаете bean-компоненты определенным образом и реализуете определенный интерфейс. Тем не менее, он позволяет вам возвращать карту свойств из определенного класса без отражения. Пример кода находится здесь:

http://pbin.oogly.co.uk/listings/viewlistingdetail/0e78eb6c76d071b4e22bbcac748c57

2
ответ дан Jon 24 November 2019 в 07:10
поделиться

Лучшее решение - использовать Dozer. Вам просто нужно что-то вроде этого в файле сопоставления:

<mapping map-id="myTestMapping">
  <class-a>org.dozer.vo.map.SomeComplexType</class-a>
  <class-b>java.util.Map</class-b>
</mapping> 

И все, обо всем остальном позаботится Dozer !!!

URL-адрес документации Dozer

2
ответ дан 24 November 2019 в 07:10
поделиться

Много потенциальных решений, но давайте добавим еще одно. Используйте Jackson (JSON processing lib) для выполнения "json-менее" преобразования, например:

ObjectMapper m = new ObjectMapper();
Map<String,Object> props = m.convertValue(myBean, Map.class);
MyBean anotherBean = m.convertValue(props, MyBean.class);

(эта запись в блоге содержит еще несколько примеров)

Вы можете, в основном, преобразовывать любые совместимые типы: совместимые, то есть, если бы вы действительно преобразовывали из типа в JSON, и из этого JSON в результирующий тип, то записи бы совпадали (если правильно сконфигурировать, то можно просто игнорировать нераспознанные).

Хорошо работает для случаев, которые можно ожидать, включая Карты, Списки, массивы, примитивы, бобовые POJO.

173
ответ дан 24 November 2019 в 07:10
поделиться
Другие вопросы по тегам:

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