2013-10-28 2 views
7

Я использую Spring Social FqlQuery для получения данных из facebook. Вот ответ JSON, который я получаю от facebook. Мой контроллер, где я получаю выход Json здесь,Преобразование Json в java-объекты с использованием Google Gson

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 внутри для петлевых выходов многократного JSON, как показано ниже .:

{ 
    "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" 
} 

Вот мой Helper Класс:

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; 
} 
} 

Когда я пытаюсь преобразовать объекты json в объект java, как сделано выше, я получаю это исключение.

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 

Может ли кто-нибудь помочь мне, где я ошибаюсь. Помогите мне преобразовать json в java-объекты. Надеюсь, мой вопрос ясен. Заранее спасибо.

EDIT СДЕЛАНО ДЛЯ УПРАВЛЕНИЯ:

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 вы упоминали в примере выше, на самом деле является jsonOject и не jsonArray, и вы пытаетесь бросить его в списке, то будет возможно только для jsonArray, не JSONObject – Jhanvi

+0

С in for loop вы получаете jsonObject, поэтому в своем классе JsonHelper удалите List или создайте json-массив в вашем цикле for и проанализируйте весь массив. – Jhanvi

+0

@Jhanvi: Я редактировал мой класс POJO, как вы сказали. Сейчас я не получаю исключений. Поэтому он связывает ценности, которые я думаю. после добавления я помещаю объект JsonHelper внутри arrayList, а затем, когда я пытаюсь получить доступ к значениям изнутри объектов, я получаю «нуль» в качестве вывода. Так вы можете понять, где это неправильно? –

ответ

1

Поскольку я не имея фактического доступа апи, поэтому я пытаюсь его со статическим значением в примере. Прежде всего, в вашем классе JsonHelper, замените все int на long, так как значения, указанные в json, имеют тип long и String. Тогда попробуйте это как упоминалось ниже:

  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

Благодарим вас за помощь. Я получил ответ. Переменная Json и моя переменная pojo должны иметь одно и то же имя. Если оно имеет одно и то же имя, то только его значения. Else null - это печать ... –

+1

@VigneshGopalakrishnan Да, в Gson имена переменных должны быть одинаковыми, и даже dataType должен быть правильным, иначе он создает проблему. – Jhanvi

 Смежные вопросы

  • Нет связанных вопросов^_^