2014-03-25 4 views
1

모든 것을 시도했지만 솔루션이 너무 못 생겼습니다. 개선이 가능하다면 (즉, 다른 구현을 사용해야하는 경우) 곧바로 답을 원합니다.GSON을 사용하여지도의 JSON 구문 분석

{"id": 2, "result": {"FirstWorld": {"FirstValue": 5, ... }, "SecondWorld":{"FirstValue": 5, ....}}, "error":null } 

는 약 200 "Values"가 있지만 두 "Worlds" :

은 방화범에 따라 나에게이 응답을 제공합니다 :

문제는 GSON와지도의지도에있다.

public void RegisterValues(String [] Names, AsyncCallback<Map<String,RegisterValues>> callback); 

public class RegisterValues 
    { 
     int FirstValue; 
     int SecondValue; 
     ... And so on 200 times !!! 

그래서 내가 지금처럼 데이터에 액세스 :

service_.RegisterValues(Names, new AsyncCallback<ControlService.RegisterValues>() 
       { 
       public void onSuccess(GlibControlService.RegisterValues result) 
        { 
         String test = "FirstValue"; 

         String message="Result for channel 1 is "; 
         for(String Name : result.keySet()) message+=Name+"="+result.get(Name); 

그러나 당신이 볼 수 있듯이,이 정말 긴 될 것입니다 이것은 내가 내 ControlService 클래스를 구문 분석 지금까지 무엇을 가지고 . 다른 문제는 "Values"중 일부에 앰퍼샌드가 포함되어있어이 메서드에서 사용할 수 없다는 의미입니다.

@SerializedName("One&Two") // Ampersand not allowed in name 
int OneTwo; //gives Invalid JSON response apparently 

아무에게도 더 나은 방법이 있습니까? 작동

편집 코드 :

private ControlService service_; 

service_.connectedNames(new String[0], new AsyncCallback<String[]>() { 

      public void onSuccess(String[] result) 
      { 
       List_.removeItem(0); 
       Names = result; 
       for(String Name : result) { 

        List_.addItem(Name); 
       } 
       List_.setEnabled(true); 
      } 
      public void onFailure(Throwable why) 
      { 
       List_.removeItem(0); 
       List_.addItem("Server error!"); 
      } 
     }); 

그런 다음 내 ControlService 클래스에서, 나는이있다 :이 완벽하게 작동

@RpcImpl(version=RpcImpl.Version.V2_0,transport=RpcImpl.Transport.HTTP_POST) 
public interface ControlService extends RemoteJsonService 
{ 

    public void connectedNames(String [] Names, AsyncCallback<String[]> callback); 

. Map<String, Map<String, Integer>>이 너무 구조의 onSucess() 부분도 있었다 확인하고, 등등

public void RegisterValues(String [] Names, AsyncCallback<Map< String,Map<String, Integer>> callback); 

과 :

나는 나의 ControlService이를 추가하여 그것을 매우 유사한 방식으로 일을했습니다. 그러나 이로 인해 내 프로그램이 중단되었습니다. 중첩 된지도가 마음에 들지 않는 것처럼 보였습니다. 그러나 GSON은 구성원 이름이 JSON 필드와 일치하면 개체에서 자동으로 구문을 분석합니다. 그래서 RegisterValues을 사용하여 자동으로 GSON이이를 구문 분석하도록합니다.

스택 추적 : 나는 GSON 자동 AsyncCallback을 사용하여 중첩 된지도를 구문 분석 할 수 없습니다 생각하는 이유

[ERROR] Errors in 'generated://AF9BA58B045D92E7896CD657C9CC5FAF/example/client/ControlService_JsonProxy.java' 
     [ERROR] Line 18: INSTANCE cannot be resolved or is not a field 
     See snapshot: /var/folders/pf/56b3mznn35gg741rlsqq424m0000gp/T/example.client.ControlService_JsonProxy2948240672238331252.java 

이다. 아래에서 제안한 내용에 따라 HTTP 호출을하는 것이 더 좋습니다.

+0

그러나이 때문에 프로그램이 중단되었습니다. 스택 추적을 가지고 있습니까? – rpax

+0

완료하지 않아도 별 도움이되지 않습니다. – fiz

+0

@rpax 내가 보낼 수있는 것이 있는지 확실하지 않습니다. – fiz

답변

2

가장 좋은 방법은 내가 게시 한 응답을 한 클래스에 넣는 것입니다.

{"id": 2, "result": {"FirstWorld": {"FirstValue": 5, ... }, "SecondWorld":{"FirstValue": 5, ....}}, "error":null } 

import java.util.Map; 

public class Response { 

    private int id; 
    private Map<String, Map<String, Integer>> result; 
    private String error; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public Map<String, Map<String, Integer>> getResult() { 
     return result; 
    } 

    public void setResult(Map<String, Map<String, Integer>> result) { 
     this.result = result; 
    } 

    public String getError() { 
     return error; 
    } 

    public void setError(String error) { 
     this.error = error; 
    } 

} 

나는이 테스트 한하고 잘 실행

.

static String json = "{\"id\":2,\"result\":{\"FirstWorld\":{\"FirstValue\":5,\"SecondValue\":6},\"SecondWorld\":{\"FirstValue\":5,\"SecondValue\":6}},\"error\":null}"; 

    public static void main(String[] args) { 


     Gson g= new Gson(); 
     Response b=g.fromJson(json, Response.class); 
     System.out.println(g.toJson(b)); 
    } 

당신은 아마 Map을 확장,이 클래스와 결과의 Map<String, Integer>를 교체해야 의 RegisterValues 클래스는 선언이 필요합니다.

+0

대단히 감사합니다. 댓글. 이제 시도해 보겠다.하지만 이것을 AsyncCallback 메서드에 어떻게 적용 할 것인지 고심하고있다. – fiz

+0

@fiz 아마도 AsyncCallback 클래스를 확장하려고 시도 할 것이다. – rpax

+0

나는 이것을 지금 줄 것이다. 나는 방금 자바를 배우기 시작했습니다. 이것이 작동하고 paypall에 "맥주를 사주세요"라고 기부하면 기꺼이 기부합니다 – fiz

관련 문제