简体   繁体   English

如何使用Java解析从android中的facebook检索到的JSONObject?

[英]How to parse JSONObject retrieved from facebook in android using Java?

I am trying to parse JSONObject returned from facebook graph API in java. 我正在尝试解析Java中从Facebook图形API返回的JSONObject。 I want to fetch some user data and friends' data through graph api. 我想通过图形API获取一些用户数据和朋友的数据。 The graph I am trying to parse is this: 我试图解析的图形是这样的:

{
  "id": "985453561536987",
  "first_name": "abc",
  "last_name": "xyz",
  "name": "abc xyz",
  "birthday": "03/17/1995",
  "gender": "male",
  "friends": {
    "data": [
      {
        "first_name": "Div",
        "last_name": "Tol",
        "gender": "female",
        "id": "150534786284567"
      }
    ],
    "paging": {
      "next": "https://graph.facebook.com/v2.4/985363151536997/friends?fields=first_name,last_name,about,birthday,gender&access_token=CAANEU8qO1HYBAJG4ZCYtc5lLuZBv3zKWe6qRN3Oy5iYtijFsQwplDH2AFe2YiXS1lZCXtxnYZBXLhBo6N65KEmW3wuNKxXiZCCVgFpg8r3elkqgCRFZBZAIgscoZCtxezk08fpiPnYqujCdMY4ZB3d88vqcDZCnpon9TjPZBE2Irzlrcqn8gzPZB8nvRu2ZBoLt6Y1yGlovgt0K18uYBbyj8GpNZCX&limit=25&offset=25&__after_id=enc_AdBfWxVZCaZAlL5ZBGlZAQjMZC2M5m4uQMNSQPfwNfsxC9TwgQzgK55kQEVGeZBEJMoyXfvySnZAOwaHCGvmgj5Ngzut6D9"
    },
    "summary": {
      "total_count": 533
    }
  },
}

I am getting NullPointerException while trying to parse the JSONObject For parsing above information I do following: 我在尝试解析JSONObject时遇到了NullPointerException,以便解析上述信息,我这样做:

public void graphActivity(AccessToken accessToken) {

        //used is graph request code from graph api explorer
        GraphRequest request = GraphRequest.newMeRequest(
                accessToken,
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject object, GraphResponse response) {
                        // Insert your code here
                        try {

                            //getting error in following code where object.getString("first_name");
                            //is written
                            //null pointer exception

                            //userVO.setId(object.getString("id");
                            userVO.setUserFirstName(object.getString("first_name"));
                            userVO.setUserLastName(object.getString("last_name"));
                            userVO.setUserName(object.getString("name"));
                            userVO.setUserBirthday(object.getString("birthday"));
                            userVO.setUserGender(object.getString("gender"));


                            JSONObject friendsJsonObject = object.getJSONObject("friends");

                            JSONArray data = friendsJsonObject.getJSONArray("data");

                            String userString = "USER::\n"
                                    + "id: " + userVO.getId() + "\n"
                                    + "fn: " + userVO.getUserFirstName() + "\n"
                                    + "ln: " + userVO.getUserLastName() + "\n"
                                    + "un: " + userVO.getUserName() + "\n"
                                    + "gen: " + userVO.getUserGender() + "\n"
                                    + "bday: " + userVO.getUserBirthday() + "\n";

                            Log.d(TAG, userString);
                            friendList = new ArrayList();
                            int length_list = data.length();
                            for (int i = 0; i < length_list; i++) {
                                JSONObject dataObj = data.getJSONObject(i);
                                //friendVO.setFriendId(dataObj.getString("id"));

                                friendVO.setFriendFirstName(dataObj.getString("first_name"));
                                friendVO.setFriendLastName(dataObj.getString("last_name"));
                                friendVO.setFriendName(dataObj.getString("name"));
                                friendVO.setFriendBirthday(dataObj.getString("birthday"));
                                friendVO.setFriendGender(dataObj.getString("gender"));
                                friendList.add(friendVO);

                                String friendString = "FRIEND::\n"
                                        + "id: " + friendVO.getFriendId() + "\n"
                                        + "fn: " + friendVO.getFriendFirstName() + "\n"
                                        + "ln: " + friendVO.getFriendLastName() + "\n"
                                        + "un: " + friendVO.getFriendName() + "\n"
                                        + "gen: " + friendVO.getFriendGender() + "\n"
                                        + "bday: " + friendVO.getFriendBirthday() + "\n";

                                Log.d(TAG, friendString);




                            }


                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }
                });

        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,first_name,last_name,name,birthday,about,gender,website,friends{first_name,last_name,name,about,birthday,gender}");
        request.setParameters(parameters);
        request.executeAsync();
    }

Note: I am new to JSON parsing. 注意:我是JSON解析的新手。 Your help would be very useful, not just for this question but also for JSON Parsing. 您的帮助将非常有用,不仅对于这个问题,而且对于JSON解析。 Thank you for reading. 感谢您的阅读。 :) :)

EDIT: errorlog: 编辑:错误日志:

10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ java.lang.NullPointerException
10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ at com.wordpress.toknowtoshare.fbintegrationexample.MainActivity$2.onCompleted(MainActivity.java:190)
10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ at com.facebook.GraphRequest$1.onCompleted(GraphRequest.java:300)
10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ at com.facebook.GraphRequest$5.run(GraphRequest.java:1364)
10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:733)
10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ at android.os.Looper.loop(Looper.java:136)
10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5021)
10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
10-24 16:31:13.050    5266-5266/com.wordpress.toknowtoshare.fbintegrationexample W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)

try this code: 试试这个代码:

GraphRequest request = GraphRequest.newMeRequest(
            loginResult.getAccessToken(),
            new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(
                 final JSONObject object,
                 GraphResponse response) {
                 // Application code
                 final JSONObject jsonObject = response.getJSONObject();
                 String first_name = "";
                 String last_name = "";
                 try {
                      first_name = jsonObject.getString("first_name");
                      last_name =  jsonObject.getString("last_name"); 
                      JSONObject friends = jsonObject.getJSONObject("friends");
                      JSONArray data = friends.getJSONArray("data");
                      JSONObject objectdata = data.getJSONObject(0);
                      String friend_first_name = objectdata.getString("first_name");
                      String friend_last_name = objectdata.getString("last_name");
                 } catch (JSONException e) {
                      e.printStackTrace();
                 }});

You can use the method fromJson from the class com.google.gson.Gson for converting your json to java object instead of using all the setters. 您可以使用com.google.gson.Gson类中的fromJson方法将json转换为java对象,而不是使用所有设置方法。 A tutorial here . 这里有一个教程。 This will simplify your code and probably resolve the problem. 这将简化您的代码并可能解决问题。

Basically GraphResponse contains the reponse JSONObject you are expecting so before the line userVO.setUserFirstName(object.getString("first_name")); 基本上GraphResponse包含您期望的响应JSONObject,因此在userVO.setUserFirstName(object.getString("first_name"));行之前userVO.setUserFirstName(object.getString("first_name"));
Please add following lines and check 请添加以下行并检查

JSONObject responseJSONObject = response.getJSONObject();
if(null != responseJSONObject){
  userVO.setUserFirstName(object.getString("first_name"));
  //your code
}

Please try the below method. 请尝试以下方法。 I have used the same in one of my project and working fine 我在我的一个项目中使用了相同的工具,并且工作正常

public Map<String, String> getGraphData(String fbGraph) {
        Gson gson = new Gson();//.toJson(fbGraph);
        Map<String, String> fbProfile = gson.fromJson(fbGraph, new TypeToken<Map<String, String>>(){}.getType());//fromJson(gson, new TypeToken<Map<String, String>>(){}.getType());
        return fbProfile;
    }

java.lang.NullPointerException is occurring at object.getString("first_name"); java.lang.NullPointerException发生在object.getString("first_name"); because JSONObject returned by GraphRequest is null . 因为GraphRequest返回的JSONObjectnull

As you are calling GraphRequest asynchronously using request.executeAsync(); 当您使用request.executeAsync();异步调用GraphRequest时 request.executeAsync(); will be executed asynchronously in a separate thread , ie your code underneath this line is not blocked. 在一个单独的线程中异步执行,即,此行下面的代码未被阻止。

so in order avoid the problem of NPE you can surround your code within following : 因此,为了避免NPE的问题,您可以将代码包含在以下内容中:

if(object!=null) { 
  //your code 
} 
else {
  Toast.makeText(this, "Please Try Again ",Toast.LENGTH_SHORT).show();
}

For parsing JSON data use following JSON Parser : 要解析JSON数据,请使用以下JSON Parser:

  1. GSON - Getting Started with GSON GSON-GSON 入门
  2. Jackson - Getting Started with Jackson 杰克逊-杰克逊入门

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM