ProgramingTip

GWT와 함께 작동하는 Json <-> Java 합성 화

bestdevel 2020. 12. 7. 20:29
반응형

GWT와 함께 작동하는 Json <-> Java 합성 화


GWT와 함께 작동 할 수있는 Java 용 간단한 Json (비) 변환기를 찾고 있습니다. 나는 조금 봤고 모든 멤버에 주석을 달거나 쓸모없는 인터페이스를 정의해야하는 몇 가지 솔루션을 찾았습니다. 꽤 지루합니다. 왜 우리는 정말 간단한 것을 가지고 있지 않습니까?

class MyBean {
    ...
}

new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)

GWT의 오버레이 유형을 살펴보십시오 . 이것이 GWT에서 JSON으로 작업하는 가장 쉬운 방법이라고 생각합니다. 다음은 링크 된 문서에서 수정 된 코드 예제입니다.

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;
    }-*/;
}

기계 유형을 정의한 후에는 JSON에서 JavaScript 객체를 생성하고 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에 도입 된 새로운 AutoBean 프레임 입니다.

빈과이를 제공하는 팩토리에 대한 인터페이스를 정의하면 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).


가장 간단한 방법은 GWT의 내장 JSON API를 사용하는 것입니다. 다음 은 문서 입니다. 그리고 그것을 사용하는 방법에 대한 훌륭한 튜토리얼 이 있습니다.

다음과 같이 간단합니다.

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

JSONValue API는 매우 멋집니다. JSON에서 값을 추출 할 때 유효성 검사를 연결하여 형식에 문제가있는 경우 예외가 발생하도록합니다.


내 질문에 대한 정답을받을 것

나는 GWT에서 bean에서 json으로, json에서 bean으로 변환하는 것이 사소한 작업이 아니라는 것을 알았습니다. GWT에는 전체 소스 코드가 필요하고이 소스 코드는 GWT에 의해 에뮬레이션 된 Java 클래스 만하 기 때문에 작동하지 않습니다. 또한 GWT에서는 리플렉션을 사용할 수 없습니다. 매우 까다로운 요구 사항!

gwt-jsonizer 라는 유일한 기존 솔루션을 찾았 습니다 . 사용자 정의 생성기

클래스를 사용하며 "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 저수준 json 지원을 제공하는 GWT 내장 클래스입니다.


RestyGWT 는 GWT에서 Java Object를 JSON으로 인코딩하거나 디코딩하기위한 강력한 라이브러리입니다.

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);

또한 Restful 웹 서비스를 사용하기 위해 사용하기 쉬운 몇 가지 API가 있습니다.

즐거운 시간 보내십시오.


이것을 확인하십시오 :

GWT Professional JSON Serializer : 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 페이지)에서 작성자 인 Ryan Dewsbury는 GWT 코드 생성을 사용하여 XML 및 JSON 문서와 직렬화를 수행하는 방법을 보여줍니다.

여기에서 코드다운로드 할 수 있습니다 . 10 장 코드 번들을 원하고 src / com / gwtapps / serialization 패키지를보고 싶습니다. 이 코드에 대한 라이센스를 보지 못했지만 저자에게 이메일을 보내 그가 말하는 것을 보았습니다. 그가 답장하면 업데이트하겠습니다.

이 솔루션의 문제 :

  • 직렬화하려는 모든 개체에 마커 인터페이스를 추가해야합니다 (그는 java.io.Serializable을 사용하지만 다른 사용자를 사용할 수 있다고 생각합니다. .
  • 이 코드는 문자열 속성 만 지원합니다. 연장 될 수 있습니다.
  • 코드는 1.4 및 1.5 용으로 만 작성되었습니다.

따라서 이것은 즉시 사용 가능한 솔루션이 아니지만 누군가가 GWT에 맞는 JSON 직렬 변환기를 빌드하기위한 훌륭한 시작점입니다. 이를 json-lib같은 서버 측의 JSON 직렬 변환기와 결합 하면 좋습니다.

이 프로젝트 도 찾았습니다 (다시 말하지만 일부 마커 인터페이스가 필요합니다).


Google 코드에서이 직렬 변환기를 사용해보세요. http://code.google.com/p/json-io/

Java로 JSON 형식을 쓰거나 읽어야하는 경우 사용할 도구입니다. 추가 클래스 등을 만들 필요가 없습니다. 한 번의 호출로 Java 개체 그래프를 JSON 형식으로 변환합니다. 반대로-JSON String 또는 Stream to Java 개체를 만듭니다. 이것은 내가 본 가장 빠른 라이브러리입니다. 이진 형식을 사용하는 대부분의 경우 ObjectOutputStream 및 ObjectInputStream보다 빠릅니다.

매우 편리한 유틸리티.


이 프로젝트 https://gerrit.googlesource.com/gwtjsonrpc/ 를 확인하는 것이 좋습니다.

Android 용 코드 검토 시스템 인 Gerrit를 지원하기 위해 생성 된 라이브러리이지만 Gerrit뿐만 아니라 모든 GWT 프로젝트에 포함되도록 설계된 독립형 모듈입니다.

합리적인 튜토리얼은 아마도 디렉토리의 최상위 레벨에있는 README 일 것입니다 . 표준 GWT RPC와 매우 유사하지만 JSON 인코딩을 사용합니다. 또한 XSRF 보호 기능이 내장되어 있습니다.


이 질문에 많이 대답하는 것 같습니다 ...

code.google.com 에 JSON 매시업에 GWT 사용 이라는 제목의 페이지가 있습니다 . (불행히도) GWT에 익숙하지 않아서 도움이되지 않을 수 있습니다.


네, 이전 답변이 원치 않았던 것으로 판명 되었기 때문에 삭제했습니다.

GWT에서 얼마나 잘 작동하는지 모르겠지만 json-lib 라이브러리를 사용하여 내가 작업하는 일반 Java 프로젝트에서 객체를 직렬화합니다.

그것은 수 자바빈에서 직접 된 JSONObject를 생성 한 후 실제 JSON 문자열 등을 얻을 수있는 결과 된 JSONObject의 toString () 메서드를 사용합니다.

마찬가지로 JSON을 다시 JavaBean으로 바꿀 수도 있습니다 .


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()직렬화, 다른 이름으로 메서드에 주석을 달 수 있음)가 필요 하지만 그게 전부입니다.

참고 URL : https://stackoverflow.com/questions/683123/json-java-serialization-that-works-with-gwt

반응형