如何将json数组中的值转换为java字符串

如何将json数组中的值转换为java字符串,java,arrays,json,Java,Arrays,Json,我需要从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()

我需要从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);
    } 
}
获取响应类

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数组示例

[{“保留区编号”:“20”,“城市”:“城市2”,“街道”:“街道1234”,“描述”:“描述123”,“日期”:“2012-10-22” 04:47:54,“客户”:“abc”}]


此代码不显示返回的JSON数组的城市名称。有人能帮我修改代码,或者建议一个更好或更简单的方法吗

Gson根据类属性名称将json字符串映射到类。所以
Data
类具有属性
title
,该属性应该映射到json数组中的
city
。您需要将您的属性重命名为
city
,以便Gson可以从json数组中找出放置
city
的位置。

或者,您可以使用注释将
城市
明确映射到
标题
。选中此项:

Gson根据类属性名称将json字符串映射到类。所以
Data
类具有属性
title
,该属性应该映射到json数组中的
city
。您需要将您的属性重命名为
city
,以便Gson可以从json数组中找出放置
city
的位置。

或者,您可以使用注释将
城市
明确映射到
标题
。检查此项:

尼基塔已经为您提供了正确的解决方案,但现在是一步一步

我将您的问题简化为以下最小测试:

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它必须期望一个数据数组,而不仅仅是一个数据对象。顺便说一句,执行代码时抛出的异常,正如已经告诉您的那样:

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方法之前,请三思。我会放弃那种方法,直接去做

System.out.println( data[0].getCity() );

尼基塔已经给了你正确的解决方案,但在这里,一步一步

我将您的问题简化为以下最小测试:

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它必须期望一个数据数组,而不仅仅是一个数据对象。顺便说一句,执行代码时抛出的异常,正如已经告诉您的那样:

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方法之前,请三思。我会放弃那种方法,直接去做

System.out.println( data[0].getCity() );

您的数据类和返回的JSON之间绝对没有关联,那么GSON怎么知道它应该做什么呢?您可能应该创建一个更合适的数据类,其中的字段与JSON字符串中的字段名称匹配。是的,我做了这些更改!标题为city,id为reserve\u否,但我还没有从回复中获得相关的城市名称。您是说发布的代码示例与您实际运行的代码没有任何关系?这使我们发现问题有点困难,你不这么认为吗?在这种情况下,您应该更新问题中的代码示例。我已经更新了!请检查:)您的数据类和返回的JSON之间绝对没有关联,那么GSON怎么知道它应该做什么呢?您可能应该创建一个更合适的数据类,其中的字段与JSON字符串中的字段名称匹配。是的,我做了这些更改!标题为city,id为reserve\u否,但我还没有从回复中获得相关的城市名称。您是说发布的代码示例与您实际运行的代码没有任何关系?这使我们发现问题有点困难,你不这么认为吗?在这种情况下,您应该更新问题中的代码示例。我已经更新了!请检查:)谢谢您的快速回复!即使在我改变了它们之后,我也没有从收到的回复中得到城市名称。还有什么我应该做的编码吗?关于更多的问题。您拥有json对象的名称和数组。您希望将其转换为单个对象。你不能。尝试类似于
Data[]datas=new Gson().fromJson(json,Data[].class)的方法我只想得到几个特定的值。与示例响应一样,我只想得到city2和20的值。还有什么我可以做的吗?谢谢你的快速回复!即使在我改变了它们之后,我也没有从收到的回复中得到城市名称。还有什么我应该做的编码吗?关于更多的问题。您拥有json对象的名称和数组。您希望将其转换为单个对象。你不能。尝试类似于
Data[]datas=new Gson().fromJson(json,Data[].class)的方法我只想得到几个特定的值。与示例响应一样,我只想得到city2和20的值。还有什么我能做的吗?