문제

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

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과 함께 도입 된 프레임 워크.

당신은 당신의 콩과 콩을 공급하는 공장을 정의하고 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).

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

이것만큼 간단합니다.

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

JSONVALUE API는 꽤 멋지다. JSON 객체에서 값을 추출 할 때 유효성 검사를 체인 할 수 있으므로 형식에 관계없이 예외가 발생됩니다.

내 질문에 대한 정답을 찾은 것 같습니다.

GWT에서 Bean to JSON과 JSON에서 Bean 변환에서 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의 JSON에 Java 객체를 인코딩하거나 디코딩하기위한 강력한 라이브러리입니다.

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가 여러 개 있습니다.

즐거운 시간 보내세요.

이것을 확인하십시오 :

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 웹 툴킷 응용 프로그램 인 510 ~ 522 페이지의 저자 인 Ryan Dewsbury는 GWT 코드 생성을 사용하여 XML 및 JSON 문서와의 직렬화 방법을 보여줍니다.

당신은 할 수 있습니다 여기에서 코드를 다운로드하십시오; 10 장 코드 번들을 원한 다음 SRC/COM/GWTAPPS/직렬화 패키지를 살펴보고 싶습니다. 나는이 코드에 대한 라이센스를 보지 못했지만 저자에게 이메일을 보냈다. 그가 대답하면 이것을 업데이트하겠습니다.

이 솔루션의 문제 :

  • 직렬화하려는 모든 객체에 마커 인터페이스를 추가해야합니다 (그는 java.io.serializable을 사용하지만 다른 사람들을 사용할 수 있다고 생각합니다. 백엔드에 최대 절전 모드를 사용하는 경우 Pojos가 이미 이와 같이 태그를 지정할 수 있습니다). .
  • 코드는 문자열 속성 만 지원합니다. 확장 될 수 있습니다.
  • 코드는 1.4와 1.5에 대해서만 작성됩니다.

따라서 이것은 상자 밖으로 솔루션이 아니라 누군가가 GWT에 맞는 JSON 시리얼 라이저를 구축 할 수있는 좋은 출발점입니다. 이를 서버 측의 JSON 시리얼 라이저와 결합하십시오. JSON-LIB 그리고 당신은 가기 좋습니다.

나는 또한 발견했다 이 프로젝트 (다시, 일부 마커 인터페이스가 필요합니다).

Google 코드 에서이 시리얼 라이저를 사용해보십시오. http://code.google.com/p/json-io/

Java로 JSON 형식을 작성하거나 읽어야하는 경우 사용 도구입니다. 추가 클래스 등을 만들 필요가 없습니다. 한 번의 호출로 Java 객체 그래프를 JSON 형식으로 변환하십시오. 반대 - JSON 문자열 또는 스트림을 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 프로젝트에서 객체를 직렬화합니다.

할 수 있습니다 Javabean에서 직접 jsonobject를 만듭니다, 그런 다음 결과 JSONOBJECT의 TOSTRING () 메소드를 사용하여 실제 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