2015-09-27 78 views
3

你好我试图解析成一个列表下面的JSON响应获取JSON数组与改造

{"beers":[{"id":"1","nombre":"Larzobispa","localidad":"Alcorcon","provincia":"Madrid"},{"id":"2","nombre":"La Cibeles","localidad":"Madrid","provincia":"Madrid"}]} 

林AbebeerApi

Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl("end_point_url") 
    .build(); 

AbebeerApi service = retrofit.create(AbebeerApi.class); 

并呼叫创建的服务

List<SingleBeer> beers = service.listBeers(); 

我没有得到啤酒列表中的任何响应。我的应用程序关闭,我在logcat中没有任何信息。

这是我的POJO类

public class SingleBeer { 
    int id; 
    String nombre; 
    String localidad; 
    String provincia; 

//getters and setters 
    } 

能有人帮帮我吗? 预先感谢您

编辑:我让你在的情况下我的PHP代码有什么不对的地方

if (mysql_num_rows($result) > 0) { 
// looping through all results 
$response["beers"] = array(); 

while ($row = mysql_fetch_array($result)) { 

    $beers = array(); 
    $beers["id"] = $row["id"]; 
    $beers["nombre"] = $row["nombre"]; 
    $beers["localidad"] = $row["localidad"]; 
    $beers["provincia"] = $row["provincia"]; 

    // push single product into final response array 
    array_push($response["beers"], $beers); 
} 
// success 
$response["succes"] = 1; 

// echoing JSON response 
echo json_encode($response); 
mysql_close($localhost); 
} else { 
    // no products found 
    $response["success"] = 0; 
    $response["message"] = "No beers have found"; 

    // echo no users JSON 
    echo json_encode($response); 
    mysql_close($localhost); 
} 

编辑2:我的问题解决了这个职位 https://stackoverflow.com/a/27698866/4669063

我创建将LenientGsonConverter类添加到我的RestAdapter的setConverter方法中

+1

看起来您在构建适配器时需要添加转换器。看到这个答案http://stackoverflow.com/a/32390665/1904517 – iagreen

+0

谢谢你的评论,但仍无法与回答工作.... – Bruno

+0

我只是改变我的代码,并使用改进1.9.0,但仍然没有工作。如果我使用https://api.github.com/users,我可以得到列表中的所有用户,但是当我想让我的Json不起作用时。它具有相同的结构...... [{ “ID”: “1”, “农布雷”: “香格里拉arzobispa”, “localidad”: “艾科坎”, “省报”: “马德里”},{ “ID”:” 2" , “农布雷”: “拉一同庆祝”, “localidad”: “马德里”, “省报”: “马德里”}] – Bruno

回答

1

结构不完全相同。您的回复有一个对象,其中有一个名为beers的字段,它是一系列啤酒。你需要反序列化对象 -

class Beers { 
    List<SingleBeer> beers; 
} 

更新你的界面 -

public interface AbebeerApi { 
    @GET("/beer_app/beers") 
    Beers listBeers(); 
} 

,您的电话 -

Beers beerContainer = service.listBeers(); 

和访问啤酒名单虽然beerContain.beers或等效的getter 。

+0

是我改变JSON响应于:[{ “ID”: “1”,”农布雷 “:” 拉arzobispa”, “localidad”: “阿尔戈尔贡”, “省报”: “马德里”},{ “ID”: “2”, “农布雷”: “拉一同庆祝”, “localidad”: “马德里” ,“provincia”:“Madrid”}]获得相同的结构(使用字符串ID),但仍然无法正常工作...我也尝试了您的代码,但无法正常工作。谢谢你的时间, – Bruno

+1

看看你是否可以得到一个logcat。这将有助于缩小范围 – iagreen

+0

在服务中,方法成功并失败,我知道代码在logcat中获取日志时运行失败。 @Override 公共无效失败(错误RetrofitError){ Log.i( “TEST”, “ERROR”);}。如果您发现有问题,请让我的网址http://abdevelopers.site88.net/beer_app/beers/ – Bruno

2
RestAdapter retrofit= new RestAdapter.Builder().setEndpoint("end_point_url") 
       .build(); 
AbebeerApi service = retrofit.create(AbebeerApi.class); 
service.getBeer(new Callback<BeerResponse>() { 

      @Override 
      public void success(BeerResponse beerResponse, Response res) { 
       // Use beerResponse for response 
      } 

      @Override 
      public void failure(RetrofitError error) { 
      } 
     }); 

这是您的界面。你应该添加回调方法。在回调中,你应该通过你的POJO。

public interface AbebeerApi { 
    @GET("/beer_app/beers") 
    public void getBeer(Callback<BeerResponse> callback) 
} 

我在回答这个api。

{"beers":[{"id":"1","nombre":"Larzobispa","localidad":"Alcorcon","provincia":"Madrid"},{"id":"2","nombre":"La Cibeles","localidad":"Madrid","provincia":"Madrid"}]} 

问题是你试图直接通过名单。你应该创建两个类来获得响应。第一个BeerResponse仅用于列表,第二个类中您应该声明您的json对象意味着id,nombre和all.Moreover主要导入的东西是您的api字段名称和您的POJO的字段名称必须相同。如果您想更改POJO的字段名称,则可以使用GSON注释@SerializedName。

public class BeerResponse{ 
List<SingleBeer> beers; 

//getters and setters 
} 

public class SingleBeer { 
    int id; 
    String nombre; 
    String localidad; 
    String provincia; 

//getters and setters 
} 
+0

使用,仍然无法正常工作。谢谢你的信息。我在error.printStackTrace()中得到了以下错误com.google.gson.stream.MalformedJsonException:使用JsonReader.setLenient(true)在第2行第2列路径中接受格式错误的JSON $ – Bruno