0

I want to parse Json to string, to show it on a listView. I search and read lots of Articles and questions but I can't find the solution

I've tried this parser JSON From: Android JSON Parsing Tutorial

    public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();           

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}

And another one from How to parse JSON in Android :

    DefaultHttpClient   httpclient = new DefaultHttpClient(new BasicHttpParams());
HttpPost httppost = new HttpPost("http://someJSONUrl.com/jsonWebService");
// Depends on your web service
httppost.setHeader("Content-type", "application/json");

InputStream inputStream = null;
String result = null;
try {
HttpResponse response = httpclient.execute(httppost);           
HttpEntity entity = response.getEntity();

inputStream = entity.getContent();
// json is UTF-8 by default
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();

String line = null;
while ((line = reader.readLine()) != null)
{
    sb.append(line + "\n");
}
result = sb.toString();
} catch (Exception e) { 
    // Oops
}
finally {
    try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
}

but in both of them when I use a string Json , everything is ok , but when I want to Read Json from a Web API (ex: http://api.androidhive.info/contacts/) this errors comes to me:

09-27 23:47:11.015: E/AndroidRuntime(28635): FATAL EXCEPTION: main
09-27 23:47:11.015: E/AndroidRuntime(28635): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mas.forcheksulotion/com.mas.forcheksulotion.MainActivity}: java.lang.NullPointerException
09-27 23:47:11.015: E/AndroidRuntime(28635):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1666)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1682)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at android.os.Looper.loop(Looper.java:130)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at android.app.ActivityThread.main(ActivityThread.java:3744)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at java.lang.reflect.Method.invokeNative(Native Method)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at java.lang.reflect.Method.invoke(Method.java:507)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at dalvik.system.NativeStart.main(Native Method)
09-27 23:47:11.015: E/AndroidRuntime(28635): Caused by: java.lang.NullPointerException
09-27 23:47:11.015: E/AndroidRuntime(28635):    at java.io.StringReader.<init>(StringReader.java:46)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at org.json.simple.JSONValue.parse(JSONValue.java:33)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at com.mas.forcheksulotion.MainActivity.onCreate(MainActivity.java:57)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
09-27 23:47:11.015: E/AndroidRuntime(28635):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1630)
09-27 23:47:11.015: E/AndroidRuntime(28635):    ... 11 more

And still I don't know for using Json on android I should work with JSONArray , or JSONObject or parse Json to String ?!

Community
  • 1
  • 1
Mas Jamie
  • 159
  • 2
  • 10
  • `com.mas.forcheksulotion.MainActivity.onCreate(MainActivity.java:57)` - what is the code here...`MainActivity.java` on line 57. That has a null value – Christopher Rucinski Sep 28 '13 at 07:13
  • 1
    I second this request - please provide us with your code so we can help you to get that null value. Also, my personal advice, do not copy and paste any solution will be reported here to parse a JSON, if you don't read a bit about JSON. Here you can find a nice summary/tutorial: http://www.elated.com/articles/json-basics/ Remember, JSON basics have nothing to do with Android, but are necessary whatever technology you will use to manage it. – fasteque Sep 28 '13 at 07:17
  • please post data you got from server, aka `result`. You have 2 modules: get from URL and parse. So verify 1st that you have proper Json (I think - no). After, observer you String – Maxim Shoustin Sep 28 '13 at 07:36

2 Answers2

1

Do this way.. This is my working code for getiing json response from url using in many app.

 /**
 * This method used to get json from url.
 * 
 * @param url
 *            represented url
 * @return represented {@link JSONObject}
 */
public JSONObject getJSONFromUrl(String url) {

    InputStream is = null;
    JSONObject jObj = null;
    try {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        HttpResponse httpResponse = httpClient.execute(httpGet);

        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();
    } catch (Exception e) {
        e.printStackTrace();
    }
    try {
        jObj = new JSONObject(getResponseBody(is));

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

/**
 * This method used to get response body.
 * 
 * @param instream
 *            represented input stream
 * @return represented {@link String}
 * @throws IOException
 *             represented {@link IOException}
 * @throws ParseException
 *             represented {@link ParseException}
 */
public String getResponseBody(final InputStream instream) throws IOException, ParseException {

    if (instream == null) {
        return "";
    }

    StringBuilder buffer = new StringBuilder();

    BufferedReader reader = new BufferedReader(new InputStreamReader(instream, "utf-8"));

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }

    } finally {
        instream.close();
        reader.close();
    }
    System.out.println(buffer.toString());
    return buffer.toString();

}
Maxim Shoustin
  • 77,483
  • 27
  • 203
  • 225
Brijesh Patel
  • 676
  • 1
  • 5
  • 13
-1

I found the problem

two solutions is great and useful , but my mistake was about the uses-permission.

i should add this to the AndroidManifest :

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
Mas Jamie
  • 159
  • 2
  • 10
  • Since your real problem was not your JSON parsing code, this whole question is moot. It would be better if you deleted it entirely so that it didn't clutter up the knowledge base. – Stephen C Feb 04 '19 at 23:26