Сериализация 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() десериализовать; можно аннотировать методы с другими именами), но это все.