2010-11-23 9 views
6

Google에서이 문제를 해결하기 위해 노력해 왔지만 그렇게 할 수는 없습니다. 상호 작용이 필요한 다른 소스에서 Java 애플릿으로 반환되는 다음 json 문자열이 있습니다.Gson으로 JSon String을 읽는 중

{ 
"A01": {"Status": "Ready", "Time": "00:00"}, 
"A02": {"Status": "Ready", "Time": "00:00"}, 
...... 
} 

현재 애플릿으로 해석 할 때 Gson을 어떻게 사용해야하는지 잘 모르겠습니다. 그 프로그램의 디자이너들과 이야기했을 때. JSON 문자열은 php에서 사용하기 위해 설계되었으므로 php에서 디코딩하면 좋은 다차원 배열을 얻습니다.

이에 대한 제안. 당신의 JSON은 약간 다른 아래와 같이 있었다면

답변

7

연관 배열 자바에서 Map로 변환한다. 따라서 Gson의 눈에는 JSON의 형식이 Map<String, Event>이고 Event 클래스의 필드는 statustime입니다.

public class Event { 
    private String Status; 
    private String Time; 

    // Add/generate getters, setters and other boilerplate. 
} 

예, 대문자로 표시된 필드 이름은 추악하지만 JSON 모양은 같습니다. 그렇지 않으면 custom Gson deserializer을 만들어야합니다.

변환 방법은 다음과 같습니다.

Map<String, Event> events = new Gson().fromJson(json, new TypeToken<Map<String, Event>>(){}.getType()); 

A01, A02 등은 Map 키가 그 값은 MapEvent의 값이된다. 다른 사용자 지정 디시리얼라이저를 추가하여 Timejava.util.Date에 넣을 수 있습니다.

다른 대안으로 Map<String, Map<String, String>>을 대신 사용할 수도 있습니다.

1

:

{ 
[ 
    {"Status": "Ready", "Time": "00:00"}, 
    {"Status": "Ready", "Time": "00:00"}, 
    ...... 
] 
} 

GSON이 개체의 컬렉션으로 JSON 변환 할 수있을 것, 객체는 자신을 정의해야합니다.

public class myAClass { 
public String Status; 
public Double time; //this could be a string/or even a Date I guess, 
        //not sure what data you are expecting 
        //and the colon may cause a problem if parsed as a double 
} 

을 그리고 그 같은 사용 : 그래서 당신이 필요 당신이 필요로

Type listType = new TypeToken<List<myAClass>>() {}.getType(); 
List<myAClass> myAClassList = new Gson().fromJson(json, listType); 
//where json is yr json string 

그런 다음 개체의 목록을 사용할 수 있습니다.

(here 더 이상 판독) PHP에서

2

그 링크는 내가보고있는 것이 아닌 것을 지적했습니다. 나는 또한 내 게시물에서 A01, A02 등을 아는 것이 매우 중요하다는 것을 잊어 버렸다. 그러나 당신이 나에게 당신을 가르쳐 준 포스트의 링크는 나를 위해 일하는 이것을 생각해 내도록 이끌어줍니다.

JsonParser parse = new JsonParser(); 
JsonObject jobj = (JsonObject)parse.parse(status);        
Set<Map.Entry<String, JsonElement>> map = jobj.entrySet(); 
Iterator<Map.Entry<String, JsonElement>> iterator = map.iterator(); 
int size = map.size(); 
for(int k = 0; k < size; k++) 
{ 
    Map.Entry<String, JsonElement> entry = iterator.next(); 
    String key = entry .getKey(); 
    JsonObject jele = (JsonObject)entry.getValue(); 
} 
+0

대부분의 JSON 라이브러리는 동일한 작업을 수행하기 위해 하나 또는 두 개의 라인 작업을 수행합니다. 이 코드를 직접 작성해야 할 필요는 없습니다. Gson을 사용하여 의도 한 결과를 얻으려면 TypeToken >를 전달해야한다고 생각합니다. – StaxMan

+0

나는 그것이 정상적으로 작동한다는 것을 알고 있지만, 프로그래밍이 아닌 일을하는 사람들이있다. 그리고 코드를 더 많이 만들면서 그런 것들을 분해하십시오. 그들이 그것을 볼 때 더 쉽습니다. – Pyromanci

관련 문제