복붙노트

[SPRING] Google의 Gson을 사용하여 Json을 Java 객체로 변환

SPRING

Google의 Gson을 사용하여 Json을 Java 객체로 변환

나는 Spring Social Fql Query를 사용하여 페이스 북에서 데이터를 얻는다. 페이스 북에서 JSON 응답을 받고있다. 내 컨트롤러에서 Json 출력을 얻는 곳이 여기 있습니다.

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

for 루프 안의 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"
}

여기 내 도우미 클래스입니다 :

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 객체로 변환하려고 할 때,이 예외가 발생합니다.

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을 자바 객체로 변환하는 것을 도와주세요. 내 질문은 분명 희망입니다. 미리 감사드립니다.

CONTROLLER로 편집 :

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. ==============================

    1.이후 실제 API를 액세스하지 못하고있어, 그래서 나는 예제에서 정적 값으로 그것을 시도하고있다. 먼저 JsonHelper 클래스에서 모든 int를 long으로 바꿉니다. json에 언급 된 값은 long 및 String 유형입니다. 그런 다음 아래와 같이 시도하십시오.

    이후 실제 API를 액세스하지 못하고있어, 그래서 나는 예제에서 정적 값으로 그것을 시도하고있다. 먼저 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());
        }
    
  2. from https://stackoverflow.com/questions/19629828/converting-json-to-java-objects-using-googles-gson by cc-by-sa and MIT license