Сериализация JSON Java, которая работает с GWT [закрыто]
Я ищу простой JSON (de)сериализатор для Java, который может работать с GWT. Я немного погуглил и нашел некоторые решения, которые требуют аннотирования каждого члена или определения бесполезных интерфейсов. Довольно скучно. Почему у нас нет чего-то действительно простого, как
class MyBean {
...
}
new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
13 ответов
взгляните на УГВ по Типы Наложения. Я думаю, что это самый простой способ работать с 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());
еще одна вещь, чтобы попробовать это новое AutoBean рамки введены с GWT 2.1.
вы определяете интерфейсы для ваших бобов и фабрики, которая их предоставляет, и 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));
они тоже работают на стороне сервера-use AutoBeanFactoryMagic.create(Beanery.class)
вместо GWT.create(Beanery.class)
.
самым простым способом было бы использовать встроенный API JSON GWT. Вот!--2-->документация. И вот большой учебник о том, как использовать его.
это так просто:
String json = //json string
JSONValue value = JSONParser.parse(json);
API JSONVALUE довольно классный. Он позволяет вам цепочку проверок при извлечении значений из объекта JSON, так что исключения будут выдаваться, если что-то не так с форматом.
Кажется, я нашел правильный ответ на мой вопрос
Я понял, что преобразование bean в json и JSON в bean в GWT не является тривиальной задачей. Известные библиотеки не будут работать, потому что GWT потребует их полный исходный код, и этот исходный код должен использовать только классы Java, которые эмулируются GWT. Кроме того, вы не можете использовать отражение в GWT. Очень жесткие требования!
Я нашел единственное существующее решение под названием gwt-jsonizer. Он использует custom генератор class и требует спутникового интерфейса для каждого "jsonable" bean. К сожалению, он не работает без исправления на последней версии GWT и не обновлялся в течение длительного времени.
Итак, я лично решил, что дешевле и быстрее сделать мои бобы, как преобразовать себя в и из 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.
RestyGWT является мощной библиотекой для кодирования или декодирования Java-объекта в 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.
приятно провести время.
проверить это:
GWT профессиональный сериализатор JSON: http://code.google.com/p/gwtprojsonserializer/
!Работает с GWT 2.0+!
json.org/java кажется, включены в GWT в эти дни:
gwt-servlet-deps.jar \ org\json\
или этот проект кажется всеобъемлющим: http://code.google.com/p/piriti/
в приложениях Google Web Toolkit на страницах 510-522 автор, Райан Дьюсбери, показывает, как использовать генерацию кода GWT для сериализации XML и JSON-документов.
вы можете скачать код здесь; вам нужны пакеты кода главы 10, а затем вы хотите посмотреть в пакете src/com/gwtapps/serialization. Я не видел лицензии на этот код, но отправил по электронной почте автору, чтобы узнать, что он говорит. Я обновлю это, если он отвечает.
проблемы с этим решением:
- вы должны добавить интерфейс маркера на все ваши объекты, которые вы хотите сериализовать (он использует java.Ио.Сериализуемый, но я предполагаю, что вы можете использовать другие-если вы используете hibernate для своего бэкэнда, ваши pojos уже могут быть помечены так).
- код поддерживает только строковые свойства; он может быть продлен.
- код написан только для 1.4 и 1.5.
Так, это не из коробки решение, но отличная отправная точка для кого-то, чтобы построить сериализатор JSON, который соответствует GWT. Объедините это с сериализатором JSON на стороне сервера, например json-lib и ты можешь идти.
Я нашел этот проект (опять же, требуется некоторый интерфейс маркер).
попробуйте этот сериализатор из кода Google:http://code.google.com/p/json-io/
Если вам нужно написать или прочитать формат JSON в Java, это инструмент для использования. Не надо создавать дополнительные классы и т. д. Преобразование графа объектов Java в формат JSON за один вызов. Сделайте наоборот-создайте строку JSON или поток для объектов Java. Это самая быстрая библиотека, которую я видел, чтобы сделать это. Это быстрее, чем ObjectOutputStream и ObjectInputStream в большинстве случаев, которые используют двоичный формат.
очень удобная утилита.
кажется, я много отвечаю на этот вопрос...
есть страница, на code.google.com под названием использование GWT для JSON Mashups. Это (к сожалению) над моей головой, так как я не так хорошо знаком с GWT, поэтому это может быть не полезно.
вы можете проверить этот проект https://gerrit.googlesource.com/gwtjsonrpc/
это библиотека, созданная для поддержки системы обзора кода для Android, Gerrit, но это автономный модуль, предназначенный для встраивания в любой проект GWT, а не только Gerrit.
разумный учебник, вероятно, является README на верхнем уровне каталога. Он очень похож на стандартный GWT RPC, но использует кодировку JSON. Он также имеет встроенная защита XSRF.
хорошо, я удалил свой предыдущий ответ, потому что он оказался именно тем, чего вы не хотели.
Я не знаю, насколько хорошо он работает с GWT, но мы используем json-lib библиотека для сериализации объектов в обычном проекте Java, где я работаю.
Он может создайте JSONObject непосредственно из JavaBean, затем используйте полученный метод toString() JSONObject, чтобы вернуть фактическую строку JSON.
кроме того, он также может обратиться JSON обратно в JavaBean.
не уверен, что если Джексон будет работать для вас. Я не знаю, есть ли GWT-specific, который вы ищете; если нет, он должен работать.
но его сериализация / десериализация работает довольно хорошо, например:
// 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()
десериализовать; можно аннотировать методы с другими именами), но это все.