0

我需要从 JSON 数组中获取值并显示它们。下面是我使用的代码。

getresponse类将向 PHP 页面发送 HTTP 请求并获取相关的 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","city":"city2","street":"street1234","discription":"discription123","date":"2012-10-22 04:47:54" "客户":"abc"}]

此代码不显示返回的 JSON 数组的城市名称。有人可以通过更正代码或建议更好或更简单的方法来帮助我吗?:)

4

2 回答 2

2

Gson 根据您的类属性名称将 json 字符串映射到您的类。所以Data类具有title应该映射到cityjson 数组中的属性。您需要将您的属性重命名为,city以便 Gson 可以找出city从 json 数组中放置的位置。
或者您可以使用注释显式映射citytitle. 检查这个:https ://sites.google.com/site/gson/gson-user-guide#TOC-JSON-Field-Naming-Support

于 2012-10-22T21:30:54.267 回答
2

Nikita 已经为您提供了正确的解决方案,但在这里,一步一步来。

我将您的问题简化为这个最小的测试:

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块吞没

关于 Data 类:在重写 toString 方法之前请三思而后行,就像在这里所做的那样。我会放弃那个方法,然后做

System.out.println( data[0].getCity() );
于 2012-10-22T22:49:28.783 回答