2

Here I have to parse JSON data getting from Facebook and display in list using Codename one so how can I cast ArrayList with Map. Here is my Json data

{
  "posts": {
    "data": [
      {
        "story": "Gaurav Takte shared a link.",
        "created_time": "2017-02-14T19:08:34+0000",
        "id": "1323317604429735_1307213186040177"
      },
      {
        "story": "Gaurav Takte shared a link.",
        "created_time": "2017-02-02T14:22:50+0000",
        "id": "1323317604429735_1295671703860992"
      },
      {
        "message": "Hurray....... INDIA WON KABBADI WORLD CUP 2016",
        "created_time": "2016-10-22T15:55:04+0000",
        "id": "1323317604429735_1182204335207730"
      },
      {
        "story": "Gaurav Takte updated his profile picture.",
        "created_time": "2016-10-21T05:35:21+0000",
        "id": "1323317604429735_1180682575359906"
      },
      {
        "message": "Friends like all of you … I would love to keep forever.
#oldmemories with # besties 
#happydays",
        "story": "Gaurav Takte with Avi Bhalerao and 5 others.",
        "created_time": "2016-10-21T05:33:55+0000",
        "id": "1323317604429735_1180682248693272"
      },
      {
        "message": "\"सर्वांना गणेशचतुर्थीच्या हार्दीक शुभेच्छा.
तुमच्या मनातील सर्व मनोकामना पूर्ण होवोत , सर्वांना
सुख, समृध्दी, ऎश्वर्य,शांती,आरोग्य लाभो हीच
बाप्पाच्या चरणी प्रार्थना. \"
गणपती बाप्पा मोरया , मंगलमुर्ती मोरया !!!",
        "story": "Gaurav Takte with Avi Bhalerao and 18 others.",
        "created_time": "2016-09-05T05:06:58+0000",
        "id": "1323317604429735_1133207030107461"
      }
    ]
}
}

So how can I parse it and also display in list manner in Codename one.

Gaurav Takte
  • 607
  • 5
  • 22
  • 1
    http://stackoverflow.com/questions/9605913/how-to-parse-json-in-android. Pls look at json parsing tutorial. lot available on stackoverflow itself – Raghunandan Mar 10 '17 at 07:00
  • As you suggest, I will try this **try{ JSONObject jObject = new JSONObject(input); JSONArray arrayj = jObject.getJSONArray("posts"); for (int i = 0; i – Gaurav Takte Mar 10 '17 at 07:34
  • and it throws this error **t org.json.JSONObject.get(JSONObject.java:516) at org.json.JSONObject.getJSONArray(JSONObject.java:592) at com.facebook.connect.Connect$FacebookData$1.readResponse(Connect.java:258) at com.codename1.io.ConnectionRequest.performOperation(ConnectionRequest.java:733) at com.codename1.io.NetworkManager$NetworkThread.run(NetworkManager.java:282) at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) ** – Gaurav Takte Mar 10 '17 at 07:35
  • you can use gson and use a jsonschema to pojo and that would reduce your effort to parse the json – Raghunandan Mar 10 '17 at 10:52

2 Answers2

2

Try this,

        JSONObject obj=new JSONObject(response);
        JSONObject posts_obj=obj.getJSONObject("posts");
        JSONArray  data_arr=posts_obj.getJSONArray("data");
        for(int i=0;i<data_arr.length();i++) {
            JSONObject data_obj=data_arr.getJSONObject(i);

            String story = data_obj.getString("story");
            String created_time = data_obj.getString("created_time");
            String id = data_obj.getString("id");
            if(data_obj.has("message")) {
                String message = data_obj.getString("message");
            }
        }
Komal12
  • 3,340
  • 4
  • 16
  • 25
  • public void fetchData(String token, Runnable callback) { ConnectionRequest req = new ConnectionRequest() { try{ JSONObject obj=new JSONObject(input); JSONObject posts_obj=obj.getJSONObject("posts"); JSONArray data_arr=posts_obj.getJSONArray("data"); for(int i=0;i – Gaurav Takte Mar 10 '17 at 07:48
  • catch(JSONException e){ e.printStackTrace(); } } @Override protected void postResponse() { callback.run(); } }; req.setPost(false); req.setUrl("https://graph.facebook.com/v2.8/me"); req.addArgumentNoEncoding("access_token", token); //this statement is used to patch access token with url req.addArgumentNoEncoding("fields", "email,name,first_name,last_name,gender,picture.width(512).height(512),posts.limit(10)"); //above statement is used to provide permission through url so server send data with respect ot permissions. NetworkManager.getInstance().addToQueue(req); } } – Gaurav Takte Mar 10 '17 at 07:48
  • I will try this one, but it will also throw an error – Gaurav Takte Mar 10 '17 at 08:01
2

Check out the JSONParser class in Codename One which the developer guide covers.

The sample from the guide is pasted below but I suggest reading it there as it is properly annotated there:

Form hi = new Form("JSON Parsing", new BoxLayout(BoxLayout.Y_AXIS));
JSONParser json = new JSONParser();
try(Reader r = new InputStreamReader(Display.getInstance().getResourceAsStream(getClass(), "/anapioficeandfire.json"), "UTF-8")) {
    Map<String, Object> data = json.parseJSON(r);
    java.util.List<Map<String, Object>> content = (java.util.List<Map<String, Object>>)data.get("root"); 
    for(Map<String, Object> obj : content) { 
        String url = (String)obj.get("url");
        String name = (String)obj.get("name");
        java.util.List<String> titles =  (java.util.List<String>)obj.get("titles"); 
        if(name == null || name.length() == 0) {
            java.util.List<String> aliases = (java.util.List<String>)obj.get("aliases");
            if(aliases != null && aliases.size() > 0) {
                name = aliases.get(0);
            }
        }
        MultiButton mb = new MultiButton(name);
        if(titles != null && titles.size() > 0) {
            mb.setTextLine2(titles.get(0));
        }
        mb.addActionListener((e) -> Display.getInstance().execute(url));
        hi.add(mb);
    }
} catch(IOException err) {
    Log.e(err);
}
hi.show();
Shai Almog
  • 51,749
  • 5
  • 35
  • 65
  • But whenever I am trying to parse the response data it will give an error – Gaurav Takte Mar 21 '17 at 09:54
  • public void fetchData(String token, Runnable callback) { ConnectionRequest req = new ConnectionRequest() { @Override protected void readResponse(InputStream input) throws IOException { JSONParser parser = new JSONParser(); try (Reader r = new InputStreamReader()){ Map data = parser.parseJSON(r); java.util.List> content = (java.util.List>)data.get("posts"); for(Map obj : content) { String message = (String)obj.get("message") MultiButton mb = new – Gaurav Takte Mar 21 '17 at 09:55
  • MultiButton(message); mb.addActionListener((e) -> Display.getInstance().execute(message)); facebook.add(mb);}} – Gaurav Takte Mar 21 '17 at 09:55
  • java.lang.NullPointerException at com.facebook.connect.Connect$FacebookData$1.readResponse(Connect.java:268) at com.codename1.io.ConnectionRequest.performOperation(ConnectionRequest.java:733) at com.codename1.io.NetworkManager$NetworkThread.run(NetworkManager.java:282) at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) [Network Thread] 0:0:26,543 - {email=gauravtakte@gmail.com, name=Gaurav Takte, first_name=Gaurav, last_name=Takte, gender=male, picture={data={height=720.0, is_silhouette=false, – Gaurav Takte Mar 21 '17 at 10:05
  • url=https://scontent.xx.fbcdn.net/v/t31.0-1/c120.0.720.720/p720x720/14711282_1180682575359906_4087581028110405984_o.jpg?oh=79ddd802cba25d9ecc89d07322c06190&oe=59615E62, width=720.0}}, posts={data=[{story=Gaurav Takte shared a link., created_time=2017-02-14T19:08:34+0000, id=1323317604429735_1307213186040177}, {story=Gaurav Takte shared a link., created_time=2017-02-02T14:22:50+0000, id=1323317604429735_1295671703860992}, {message=Hurray....... INDIA WON KABBADI WORLD CUP 2016, created_time=2016-10-22T15:55:04+0000, id=1323317604429735_1182204335207730}, – Gaurav Takte Mar 21 '17 at 10:06
  • id=1323317604429735_1180682248693272}, {message="सर्वांना गणेशचतुर्थीच्या हार्दीक शुभेच्छा. at com.facebook.connect.Connect$FacebookData$1.readResponse(Connect.java:268) तुमच्या मनातील सर्व मनोकामना पूर्ण होवोत , सर्वांना सुख, समृध्दी, ऎश्वर्य,शांती,आरोग्य लाभो हीच बाप्पाच्या चरणी प्रार्थना. " at com.codename1.io.ConnectionRequest.performOperation(ConnectionRequest.java:733) at com.codename1.io.NetworkManager$NetworkThread.run(NetworkManager.java:282) at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) – Gaurav Takte Mar 21 '17 at 10:07
  • What's in like 268 of `Connect.java`? One answer is enough as it's harder to follow all of these – Shai Almog Mar 22 '17 at 05:10