Json ↔ Сериализация Java, которая работает с GWT
Я ищу простой Json (de) сериализатор для Java, который может работать с GWT. Я немного искал Google и нашел некоторые решения, которые либо требуют аннотировать каждого участника, либо определять бесполезные интерфейсы. Довольно скучно. Почему бы нам не сделать что-то действительно простое, например
class MyBean {
...
}
new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
Ответы
Ответ 1
Взгляните на GWT Типы наложения. Я думаю, что это самый простой способ работать с JSON в GWT. Здесь приведен пример модифицированного кода из связанной статьи:
public class Customer extends JavaScriptObject {
public final native String getFirstName() /*-{
return this.first_name;
}-*/;
public final native void setFirstName(String value) /*-{
this.first_name = value;
}-*/;
public final native String getLastName() /*-{
return this.last_name;
}-*/;
public final native void setLastName(String value) /*-{
this.last_name = value;
}-*/;
}
После определения типа наложения легко создать объект JavaScript из JSON и получить доступ к его свойствам в Java:
public static final native Customer buildCustomer(String json) /*-{
return eval('(' + json + ')');
}-*/;
Если вы хотите повторное представление объекта JSON, вы можете обернуть тип наложения в JSONObject:
Customer customer = buildCustomer("{'Bart', 'Simpson'}");
customer.setFirstName("Lisa");
// Displays {"first_name":"Lisa","last_name":"Simpson"}
Window.alert(new JSONObject(customer).toString());
Ответ 2
Еще одна вещь, которую следует попробовать - это новая инфраструктура AutoBean, введенная с GWT 2.1.
Вы определяете интерфейсы для beans и factory, которые их расшифровывают, а GWT генерирует для вас реализации.
interface MyBean {
String getFoo();
void setFoo(String foo);
}
interface MyBiggerBean {
List<MyBean> getBeans();
void setBeans(List<MyBean> beans>;
}
interface Beanery extends AutoBeanFactory{
AutoBean<MyBean> makeBean();
AutoBean<MyBiggerBean> makeBigBean();
}
Beanery beanFactory = GWT.create(Beanery.class);
void go() {
MyBean bean = beanFactory.makeBean().as();
bean.setFoo("Hello, beans");
}
AutoBeanCodex может использоваться для сериализации их в json и из него.
AutoBean<MyBean> autoBean = AutoBeanUtils.getAutoBean(bean);
String asJson = AutoBeanCodex.encode(autoBean).getPayload();
AutoBean<MyBean> autoBeanCloneAB =
AutoBeanCodex.decode(beanFactory, MyBean.class, asJson );
MyBean autoBeanClone = autoBeanCloneAB.as();
assertTrue(AutoBeanUtils.deepEquals(autoBean, autoBeanClone));
Они также работают на стороне сервера - используйте AutoBeanFactoryMagic.create(Beanery.class)
вместо GWT.create(Beanery.class)
.
Ответ 3
Самый простой способ - использовать встроенный JSON API GWT. Здесь документация. И вот отличный учебник о том, как его использовать.
Это так просто:
String json = //json string
JSONValue value = JSONParser.parse(json);
API JSONValue довольно крут. Он позволяет вам проверять цепочку при извлечении значений из объекта JSON, чтобы исключения были выброшены, если что-то не согласуется с форматом.
Ответ 4
Кажется, я нашел правильный ответ на мой вопрос
Я понял, что преобразование bean в json и json в bean в GWT не является тривиальной задачей. Известные библиотеки не будут работать, потому что GWT потребует их полного исходного кода, и этот исходный код должен использовать только классы Java, которые подражают GWT. Кроме того, вы не можете использовать отражение в GWT. Очень жесткие требования!
Я нашел единственное существующее решение с именем gwt-jsonizer. Он использует собственный Generator класс и требует спутникового интерфейса для каждого "jsonable" bean. К сожалению, он не работает без исправления последней версии GWT и не обновляется в течение длительного времени.
Итак, я лично решил, что дешевле и быстрее сделать мой beans khow как преобразовать себя в json и из него. Вот так:
public class SmartBean {
private String name;
public String getName() { return name; }
public void setName(String value) { name = value; }
public JSONObject toJson() {
JSONObject result = new JSONObject();
result.put("name", new JSONString(this.name));
return result;
}
public void fromJson(JSONObject value) {
this.name = value.get("name").isString().stringValue();
}
}
JSONxxxx
- это встроенные классы GWT, которые обеспечивают поддержку json с низким уровнем.
Ответ 5
RestyGWT - мощная библиотека для кодирования или декодирования Java Object для JSON в GWT:
import javax.ws.rs.POST;
...
public interface PizzaOrderCodec extends JsonEncoderDecoder<PizzaOrder> {
}
Тогда:
// GWT will implement the interface for you
PizzaOrderCodec codec = GWT.create(PizzaOrderCodec.class);
// Encoding an object to json
PizzaOrder order = ...
JSONValue json = codec.encode(order);
// decoding an object to from json
PizzaOrder other = codec.decode(json);
Он также имеет несколько простых в использовании API для потребления Restful web-сервисов.
Хорошо провести время.
Ответ 6
Проверьте это:
GWT Professional JSON Serializer:
http://code.google.com/p/gwtprojsonserializer/
! Работает с GWT 2.0 +!
Ответ 7
json.org/java, кажется, включен в GWT в эти дни:
GWT-сервлет-deps.jar\орг\JSON\
Или, этот проект кажется всеобъемлющим:
http://code.google.com/p/piriti/
Ответ 8
В приложениях Google Web Toolkit, с 510 по 522, автор, Райан Дьюсбери, показывает, как использовать генерацию кода GWT для сериализации в документы XML и JSON и из них.
Вы можете загрузить здесь код; вам нужны комплекты кода главы 10, а затем вы хотите посмотреть в пакете src/com/gwtapps/serialization. Я не видел лицензии на этот код, но отправил его по электронной почте, чтобы узнать, что он говорит. Я обновлю это, если он ответит.
Проблемы с этим решением:
- Вам нужно добавить интерфейс маркера на все ваши объекты, которые вы хотите сериализовать (он использует java.io.Serializable, но я полагаю, вы могли бы использовать другие - если вы используете спящий режим для своего бэкэнд, ваши поля могут уже быть помечены как это).
- Код поддерживает только свойства строки; он может быть расширен.
- Код написан только для 1.4 и 1.5.
Итак, это не решение, но отличная отправная точка для компилятора JSON, который подходит для GWT. Объедините это с JSON-сериализатором на стороне сервера, например json-lib, и вам хорошо идти.
Я также нашел этот проект (опять же, требуется некоторый интерфейс маркера).
Ответ 9
Попробуйте этот сериализатор из Google Code: http://code.google.com/p/json-io/
Если вам нужно написать или прочитать JSON-формат в Java, это инструмент для использования. Нет необходимости создавать дополнительные классы и т.д. Преобразуйте граф объекта Java в формат JSON за один вызов. Сделайте обратное - создайте объекты JSON String или Stream для Java. Это самая быстрая библиотека, которую я видел еще для этого. В большинстве случаев он быстрее ObjectOutputStream и ObjectInputStream, которые используют двоичный формат.
Очень удобная утилита.
Ответ 10
Кажется, я очень много отвечаю на этот вопрос...
Там страница на code.google.com под названием Использование GWT для JSON Mashups. Это (к сожалению) у меня над головой, так как я не знаком с GWT, поэтому это может быть не полезно.
Ответ 11
Вы можете проверить этот проект https://gerrit.googlesource.com/gwtjsonrpc/
Это библиотека, созданная для поддержки системы обзора кода для Android, Gerrit, но это автономный модуль, предназначенный для встраивания в любой проект GWT, а не только с Gerrit.
Разумным руководством является, вероятно, README на верхнем уровне каталога. Он очень похож на стандартный GWT RPC, но использует JSON-кодирование. Он также имеет встроенную защиту XSRF.
Ответ 12
ОК, я удалил свой предыдущий ответ, потому что он оказался именно тем, чего вы не хотели.
Я не знаю, насколько хорошо он работает с GWT, но мы используем библиотеку json-lib для сериализации объектов в нормальном Java проект, в котором я работаю.
Он может создать JSONObject непосредственно из JavaBean, а затем использовать полученный метод JSONObject toString(), чтобы вернуть фактическую строку JSON.
Аналогично, он также может превратить JSON обратно в JavaBean.
Ответ 13
Не уверен, что Jackson будет работать для вас.
Я не знаю, есть ли GWT-специфический, который вы ищете; если нет, то он должен работать.
Но его сериализация/десериализация работает довольно хорошо, например:
// read json, create object
ObjectMapper mapper = new ObjectMapper();
MyBean bean = mapper.readValue(jsonAsString, MyBean.class);
// and write out
StringWriter sw = new StringWriter();
mapper.writeValue(sw, user);
String jsonOut = sw.toString();
Вам нужны аксессоры (getX()
для сериализации, setX()
для десериализации, могут аннотировать методы с другими именами), но об этом.