2012-10-22 45 views
0

我需要从JSON数组中取值并显示它们。以下是我用过的代码。如何将json数组的值转换为java字符串

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“,”customer“:”abc“}]

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

+0

你的Data类和返回的JSON之间绝对没有关系,所以GSON如何知道它应该做什么?您应该创建一个更合适的Data类,并使用与JSON字符串中的字段名称相匹配的字段。 – fvu

+0

是的,我做了这些改变!标题作为城市和id作为reserve_no但我仍然没有得到相应的城市名称 – senrulz

+0

所以你说发布的代码示例并没有真正与你实际运行的关系(已经)?这使我们发现问题有点困难,你不这么认为吗?在这种情况下,你应该更新你的代码示例。 – fvu

回答

2

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

我您的降低问题这个最小测试:

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字符串映射到您的类。所以Data类有属性title这应该被映射到json数组中的city。你需要重命名你的财产city,所以Gson可以找出在哪里把city从json数组。
或者您可以使用注释明确地将city映射到title。检查此:https://sites.google.com/site/gson/gson-user-guide#TOC-JSON-Field-Naming-Support

+0

感谢您的快速回复!即使我改变了他们即使没有得到收到的响应城市名称。还有什么我应该做的代码? – senrulz

+1

关于更多问题。你有和ARRAY的JSON对象。并且您想将其转换为单个对象。你不能。尝试类似'Data [] datas = new Gson()。fromJson(json,Data []。class);' –

+0

我只想得到几个特定的​​值。正如在示例中,我只想得到city2和20的值。无论如何,我能做到吗? – senrulz

相关问题