2013-10-28 13 views
7

Używam Spring Social FqlQuery, aby pobrać dane z Facebooka. Oto odpowiedź JSON, którą otrzymuję z Facebooka. Mój kontroler gdzie jestem coraz wyjście JSON jest tutaj,Konwersja JSONa do obiektów java za pomocą Gsona Google'a

fql = "SELECT work FROM user WHERE uid = me()"; 
facebook.fqlOperations().query(fql, new FqlResultMapper<Object>() { 
    public Object mapObject(FqlResult result) { 
     List list = (List) result.getObject("work"); 
     for (Object object : list) { 
      JsonHelper jsonHelper = new JsonHelper(); 
      Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
      String jsonOutput = gson.toJson(object); 
      System.out.println(jsonOutput); 
      gson.fromJson(jsonOutput, JsonHelper.class); 
     } 

System.out.println wewnątrz pętli for Wyjścia stwardnienie JSON jak poniżej .:

{ 
    "employer": { 
    "id": 129843057436, 
    "name": "www.metroplots.com" 
    }, 
    "location": { 
    "id": 102186159822587, 
    "name": "Chennai, Tamil Nadu" 
    }, 
    "position": { 
    "id": 108480125843293, 
    "name": "Web Developer" 
    }, 
    "start_date": "2012-10-01", 
    "end_date": "2013-05-31" 
} 
{ 
    "employer": { 
    "id": 520808381292985, 
    "name": "Federation of Indian Blood Donor Organizations" 
    }, 
    "start_date": "0000-00", 
    "end_date": "0000-00" 
} 

Oto moja klasa Pomocnik:

import java.util.List; 

public class JsonHelper { 

class Employer{ 
    private int id; 
    private String name; 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

} 
class Location{ 
    private int id; 
    private String name; 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

} 
class Position{ 
    private int id; 
    private String name; 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 
//Edited After here 
private String start_Date; 
private String end_Date; 
private Employer employer; 
private Location location; 
private Position position; 
public String getStart_Date() { 
    return start_Date; 
} 
public void setStart_Date(String start_Date) { 
    this.start_Date = start_Date; 
} 
public String getEnd_Date() { 
    return end_Date; 
} 
public void setEnd_Date(String end_Date) { 
    this.end_Date = end_Date; 
} 
public Employer getEmployer() { 
    return employer; 
} 
public void setEmployer(Employer employer) { 
    this.employer = employer; 
} 
public Location getLocation() { 
    return location; 
} 
public void setLocation(Location location) { 
    this.location = location; 
} 
public Position getPosition() { 
    return position; 
} 
public void setPosition(Position position) { 
    this.position = position; 
} 
} 

Kiedy próbuję konwertować obiekty json na obiekt java, jak to zrobiono powyżej, otrzymuję ten wyjątek.

HTTP Status 500 - Request processing failed; nested exception is com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 6 column 16 

Czy ktoś może mi pomóc, gdzie się mylę. Pomóż mi konwertować json na obiekty java. Mam nadzieję, że moje pytanie jest jasne. Z góry dziękuję.

EDIT wprowadzone do kontrolera:

facebook.fqlOperations().query(fql, new FqlResultMapper<Object>() { 
public Object mapObject(FqlResult result) { 
List<JsonHelper> json = new ArrayList<JsonHelper>(); 
List list = (List) result.getObject("work"); 

for (Object object : list) { 
    Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
    String jsonOutput = gson.toJson(object); 
    System.out.println(jsonOutput); 
    JsonHelper jsonHelper = gson.fromJson(jsonOutput, JsonHelper.class); 
    json.add(jsonHelper); 
    System.out.println(jsonHelper.getStart_Date()); 
} 

for (JsonHelper jsonHelper : json) { 
    System.out.println(jsonHelper.getStart_Date()); 
} 

return list; 
} 

}); 
+1

JSON już wspomniano powyżej w przykładzie jest rzeczywiście jsonOject i nie jsonArray, a ty próbujesz rzucić go na liście, to jest to możliwe tylko dla jsonArray, nie JSONObject – Jhanvi

+0

Rejestracja w pętli for dostajesz jsonObject, więc w klasie JsonHelper usuń List lub utwórz tablicę json w pętli for i przeanalizuj całą tablicę razem. – Jhanvi

+0

@Jhanvi: Edytowałem moją klasę POJO tak jak powiedziałeś. Nie dostaję teraz wyjątków. Więc wiąże to wartości, które myślę. po dodaniu umieszczam obiekt JsonHelper wewnątrz tablicyList, a kiedy próbuję uzyskać dostęp do wartości z wnętrza obiektów, otrzymuję "null" jako wynik. Więc możesz dowiedzieć się, gdzie jest źle? –

Odpowiedz

1

Ponieważ nie jestem posiadające rzeczywisty dostęp do API, więc próbuję go z wartości statycznej w przykładzie. Najpierw w klasie JsonHelper zamień wszystkie int przez long, ponieważ wartości wymienione w jsonie są typu long i String. Następnie spróbuj go jak wymienione poniżej:

  String str = "{\n" 
      + " \"employer\": {\n" 
      + " \"id\": 129843057436,\n" 
      + " \"name\": \"www.metroplots.com\"\n" 
      + " },\n" 
      + " \"location\": {\n" 
      + " \"id\": 102186159822587,\n" 
      + " \"name\": \"Chennai, Tamil Nadu\"\n" 
      + " },\n" 
      + " \"position\": {\n" 
      + " \"id\": 108480125843293,\n" 
      + " \"name\": \"Web Developer\"\n" 
      + " },\n" 
      + " \"start_date\": \"2012-10-01\",\n" 
      + " \"end_date\": \"2013-05-31\"\n" 
      + "}"; 


    List<JsonHelper> json = new ArrayList<JsonHelper>(); 
    Gson gson = new Gson(); 
    JsonHelper users = gson.fromJson(str, JsonHelper.class); 
    json.add(users); 


    for (JsonHelper js_obj : json) { 
     System.out.println(js_obj.getEmployer().getId()); 
     System.out.println(js_obj.getEmployer().getName()); 
    } 
+0

Dziękuję za pomoc. Mam odpowiedź. Zmienna Json i moja zmienna pojo powinny mieć taką samą nazwę. Jeśli ma taką samą nazwę, to tylko jej wartości. Inna null drukuje ... –

+1

@VigneshGopalakrishnan Tak, w Gson, nazwy zmiennych muszą być takie same, a nawet typ danych powinien być poprawny, w przeciwnym razie stwarza problem. – Jhanvi

Powiązane problemy