0

Я пытаюсь использовать библиотеку flexjson. Но в моем объекте я должен использовать: com.google.api.client.util.DateTime, у которых нет конструктора параметров. Я всегда получаю NoSuchMethodException с сообщением: Flexjson will instantiate any protected, private, or public no-arg constructor. У меня есть источники и пытается что-то сделать с этим, вот код:Сериализация объектов с помощью flexjson

constructor = clazz.getDeclaredConstructor(); 
constructor.setAccessible(true); 
return constructor.newInstance(); 

Исключение бросают в clazz.getDeclaredConstructor() из-за пустого конструктора не хватает. Каков наилучший подход к поиску конструктора, скажем, подписи:

DateTime(long timestamp)?

У кого-нибудь сталкиваются с этой проблемой в этой библиотеке? Возможно, вы можете предложить использовать другой. Я использую его для сериализации объектов, генерируемых Google Cloud Endpoints. Может быть, я могу сделать это с другим подходом?

+0

лучший подход заключается в пустой конструктор. ваша метка времени будет установлена ​​позже, если она присутствует в объекте json. для этого вы можете рассмотреть возможность расширения DateTime. – njzk2

+0

njzk2, я не могу расширять 'DateTime', потому что он находится в автогенерированном файле, и он генерируется из объекта' java.util.Date' на бэкэнд приложения. – sennin

ответ

1

Для этого не нужно менять исходный код Flexjson. Способ справиться с этим состоит в том, чтобы создать собственную реализацию ObjectFactory и зарегистрировать, что для типа, в котором вы привязываетесь. Оттуда вы можете создать экземпляр, однако, вы желаете. Проще всего подклассировать BeanObjectFactory и переопределить метод instantiate(). Там вы можете делать все, что хотите, создать экземпляр объекта, который вы хотите. Подклассифицируя BeanObjectFactory, он позаботится о привязке отдельных свойств от JSON к вашему объекту с помощью setter/getter этого объекта. Если ваш объект не поддерживает методы свойств, вам может быть проще реализовать ObjectFactory и вручную установить значения этого объекта из JSON. На сайте Flexjson имеется много документации по созданию ObjectFactories.

Тогда вы можете зарегистрировать свой ObjectFactory к этому типу данных с помощью:

new JSONDeserializer<SomeObject>() 
    .use(DateTime.class, new DateTimeObjectFactory()) 
    .deserialize(json);