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
'ProgramingTip' 카테고리의 다른 글
Visual Studio Code- 가져 오기 견적 설정 조정 (0) | 2020.12.07 |
---|---|
전 처리기 토큰을 공유로 변환 (0) | 2020.12.07 |
UITableView, cellForRowAtIndexPath 동안 어떤 섹션을 어떻게 알 수 있습니까? (0) | 2020.12.07 |
"void 0"과 "undefined"의 차이 (0) | 2020.12.07 |
F #은 어떤 영역에서 "사용에있어 전혀 의미가 없습니까?" (0) | 2020.12.07 |