2012-10-22 4 views
0

JSON 배열에서 값을 가져 와서 표시해야합니다. 아래는 내가 사용한 코드입니다.json 배열에서 값을 Java 문자열로 변환하는 방법

getresponse 클래스는 HTTP 요청을 PHP 페이지로 보내고 관련 JSON 배열을 가져오고 공용 변수 res은 반환 된 JSON 배열을 보유합니다.

public class JSONConverter { 
    public void convert(){ 
     getresponse gr=new getresponse(); 
     String json = gr.res; 
     Data data = new Gson().fromJson(json, Data.class); 
     System.out.println(data); 
    } 
} 

class Data { 
    private String city; 
    private int reserve_no; 

    public String getCity() { return city; } 
    public int getReserve_no() { return reserve_no; } 

    public void setTitle(String city) { this.city = city; } 
    public void setId(int reserve_no) { this.reserve_no = reserve_no; } 

    public String toString() { 
     return String.format(city); 
    } 
} 

getrespose 클래스 아래

public class getresponse { 
public static String res; 
    public void counter() { 
try { 
    URL url = new URL("http://taxi.net/fetchLatest.php"); 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
    conn.setRequestMethod("GET"); 
    conn.setRequestProperty("Accept", "application/json"); 

    if (conn.getResponseCode() != 200) { 
     throw new RuntimeException("Failed : HTTP error code : " 
       + conn.getResponseCode()); 
    } 

    BufferedReader br = new BufferedReader(new InputStreamReader(
     (conn.getInputStream()))); 
      String str; 
    while ((str =br.readLine()) != null) {         
        res=str; 

    } 

    conn.disconnect(); 

는 JSON 어레이의 일례는 리턴된다.

[{ "reserve_no": "20", "도시": "시티 2", "거리": "street1234", "discription": "discription123", "날짜": "2012년 10월 22일 04:47:54 ","customer ":"abc "}]

이 코드는 반환 된 JSON 배열의 도시 이름을 표시하지 않습니다. 누군가 코드를 수정하거나 더 나은 방법 또는 더 쉬운 방법을 제안함으로써 이것을 도와 줄 수 있습니까? :)

+0

Data 클래스와 반환 된 JSON 간에는 아무런 상관 관계가 없으므로 GSON이 어떻게해야하는지 알 수 있습니까? JSON 문자열의 필드 이름과 일치하는 필드를 사용하여보다 적절한 Data 클래스를 만들어야합니다. – fvu

+0

예, 저는 그러한 변화를했습니다! reserve_no로 도시와 ID로 제목을 붙 였지만 응답에서 관련 도시 이름을 아직받지 못했습니다. – senrulz

+0

게시 된 코드 샘플은 실제로 실행중인 것과 관련이 없습니다. 그건 우리가 문제를 발견하는 것이 약간 어렵습니다. 그렇죠? 이 경우 질문에서 코드 샘플을 업데이트해야합니다. – fvu

답변

2

Nikita는 이미 정확한 해결책을 제공해 왔지만 여기에 나와 있습니다.

는 I이 최소한의 테스트 문제를 감소 :

import com.google.gson.Gson; 

public class TestGSON 
{ 
    public static void main(String[] args) 
    { 
     // that's your JSON sample 
     String json = "[{\"reserve_no\":\"20\",\"city\":\"city2\",\"street\":\"street1234\",\"discription\":\"discription123\",\"date\":\"2012-10-22 04:47:54\",\"customer\":\"abc\"}]"; 
     // note: we tell Gson to expect an **array** of Data 
     Data data[] = new Gson().fromJson(json, Data[].class); 
     System.out.println(data[0]); 
    } 
} 

문제가 JSON 단편 실제로 오브젝트의 배열 아니라 목적이다 (따라서 [] 주위). 따라서 GSon에게 Data 객체뿐 아니라 일련의 Data를 기대해야한다고 말해야합니다.

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 

물론하지 않는 한이 데이터 클래스와 관련하여 빈 catch 블록

삼켜있어 : : 그런데, 이미 당신을 말 그대로 코드를 실행할 때 발생 것을 제외하여 생각 두 번 전에 toString 메소드를 오버라이드하기 전에. 그 메소드를 삭제하고 그냥 수행합니다

+0

설명 주셔서 감사합니다! 그리고 효과가있었습니다! :) – senrulz

2

Gson은 json string을 클래스 속성 이름에 기반한 클래스에 매핑합니다. 따라서 Data 클래스에는 title 속성이 있으며 json 배열에 city에 매핑되어야합니다. Gson이 json 배열에서 city을 넣을 곳을 알아낼 수 있도록 속성 이름을 city으로 바꿔야합니다.
또는 주석을 사용하여 citytitle에 명시 적으로 매핑 할 수 있습니다. 이것을 확인하십시오 : https://sites.google.com/site/gson/gson-user-guide#TOC-JSON-Field-Naming-Support

+0

빠른 답장을 보내 주셔서 감사합니다!심지어 i가 그 도시 이름을 얻지 않고있는 im를 응답을 받으면서 바꿨 던 후에. 내가 코딩해야 할 다른 것? – senrulz

+1

더 많은 문제가 있습니다. 당신은 json 객체의 ARRAY를 가지고 있습니다. 그리고 그것을 하나의 객체로 변환하려고합니다. 당신은 할 수 없습니다. 'Data [] datas = new Gson() .Json (json, Data []. class); ' –

+0

과 같은 것을 시도해보십시오. 예제 응답에서 city2와 20 값만 가져 오려고합니다. 어쨌든 내가 할 수 있니? – senrulz

관련 문제