Вопрос

Я ищу простой Сериализатор Json (de) для Java, который мог бы работать с GWT.Я немного погуглил и нашел несколько решений, которые либо требуют аннотирования каждого участника, либо определяют бесполезные интерфейсы.Довольно скучный.Почему бы нам не предложить что-нибудь действительно простое, например

class MyBean {
    ...
}

new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
Это было полезно?

Решение

Взгляните на GWT's Типы наложения.Я думаю, что это, безусловно, самый простой способ работы с 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());

Другие советы

Еще одна вещь, которую стоит попробовать, - это новое Автобианин фреймворк, представленный с 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");
}

В АвтоБанкОдекс может использоваться для сериализации их в 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).

Самым простым способом было бы использовать встроенный JSON API GWT.Вот документация.И вот это отличный учебник о том, как им пользоваться.

Это так просто, как это:

String json = //json string
JSONValue value = JSONParser.parse(json);

API JsonValue довольно крутой.Это позволяет вам выполнять цепочку проверок при извлечении значений из объекта JSON, так что будут выдаваться исключения, если что-то не так с форматом.

Кажется, я нашел правильный ответ на свой вопрос

Я выяснил, что преобразование bean в json и json в bean в GWT не является тривиальной задачей.Известные библиотеки не будут работать, потому что GWT потребует их полного исходного кода, а этот исходный код должен использовать только классы Java, которые в некоторой степени эмулируются GWT.Кроме того, вы не можете использовать отражение в GWT.Очень жесткие требования!

Я нашел единственное существующее решение с именем gwt-jsonizer-генератор.Он использует пользовательский Генератор класс и требует вспомогательного интерфейса для каждого "jsonable" компонента.К сожалению, он не работает без исправлений в последней версии 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.

РестиГВТ это мощная библиотека для кодирования или декодирования 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.

Желаю приятно провести время.

Проверьте это:

Профессиональный сериализатор JSON GWT:http://code.google.com/p/gwtprojsonserializer/

! Работает с GWT 2.0+!

json.org/java кажется, в наши дни это включено в GWT:

gwt-сервлет-deps.jar\org\json\

Или же этот проект кажется всеобъемлющим:http://code.google.com/p/piriti/

В приложениях Google Web Toolkit, страницы с 510 по 522, автор, Райан Дьюсбери, показывает, как использовать генерацию кода GWT для выполнения сериализации в XML- и JSON-документах и из них.

Ты можешь скачать код можно здесь;вам нужны пакеты кода главы 10, а затем вы хотите посмотреть в пакете src / com / gwtapps / serialization .Я не видел лицензии на этот код, но отправил автору электронное письмо, чтобы узнать, что он говорит.Я обновлю это, если он ответит.

Проблемы с этим решением:

  • Вам нужно добавить интерфейс маркера ко всем вашим объектам, которые вы хотите сериализовать (он использует java.io.Serializable, но я полагаю, вы могли бы использовать другие - если вы используете hibernate для своего бэкэнда, ваши pojos уже могут быть помечены подобным образом).
  • Код поддерживает только строковые свойства;это может быть продлено.
  • Код написан только для 1.4 и 1.5.

Итак, это не готовое решение, но отличная отправная точка для кого-то по созданию сериализатора JSON, который соответствует GWT.Объедините это с сериализатором JSON на стороне сервера, например json-библиотека и ты готов идти.

Я также нашел этот проект (опять же, требуется некоторый интерфейс маркера).

Попробуйте этот сериализатор из Google Code: http://code.google.com/p/json-io/

Если вам нужно записать или прочитать формат JSON на Java, это подходящий инструмент.Нет необходимости создавать дополнительные классы и т.д.Преобразуйте график объектов Java в формат JSON за один вызов.Сделайте обратное - создайте строку JSON или поток для объектов Java.Это самая быстрая библиотека, которую я когда-либо видел, чтобы сделать это.В большинстве случаев это быстрее, чем ObjectOutputStream и ObjectInputStream, которые используют двоичный формат.

Очень удобная утилита.

Возможно, вы захотите проверить этот проект https://gerrit.googlesource.com/gwtjsonrpc/

Это библиотека, созданная для поддержки системы проверки кода для Android, Gerrit, но это автономный модуль, предназначенный для встраивания в любой проект GWT, а не только Gerrit.

Разумным руководством, вероятно, является ПРОЧИТАЙ МЕНЯ на верхнем уровне каталога.Он очень похож на стандартный GWT RPC, но использует кодировку JSON.Он также имеет встроенную защиту от XSRF.

Кажется, я часто отвечаю на этот вопрос...

Там есть страница на code.google.com под названием Использование GWT для мэшапов JSON.Это (к сожалению) выше моего понимания, поскольку я не очень хорошо знаком с GWT, так что это может оказаться бесполезным.

Хорошо, я удалил свой предыдущий ответ, потому что оказалось, что это именно то, чего вы не хотели.

Я не знаю, насколько хорошо это работает с GWT, но мы используем json-библиотека библиотека для сериализации объектов в обычном Java-проекте, где я работаю.

Это может создайте JSONObject непосредственно из JavaBean, затем используйте результирующий метод toString() от JSONObject, чтобы вернуть фактическую строку JSON обратно.

Аналогично, он также может превращаться JSON обратно в JavaBean.

Не уверен, что если Джексон сработало бы на вас.Я не знаю, есть ли что-то специфичное для 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() для десериализации;может аннотировать методы с другими именами), но не более того.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top