0

I am newbie to android development. I am working in android studio. I have some json files that i have placed inside my assets folder. Now i want to populate the data in json file(s) into a spinner. I do know how to use spinner and populate data using web service but i don't have a clue how to do it with json file(s). Moreover i couldn't find any tutorial on that but yes i did find how to read data from json file, but i want to populate it in spinner. Below is one of my json file data .

ref.json

{"reference":
    [
     {"ref_no":"11111111111111","Name":"Faisal"},

     {"ref_no":"22222222222222","Name":"Salman"},

     {"ref_no":"33333333333333","Name":"Asim"},

     {"ref_no":"44444444444444","Name":"Asad"},

     {"ref_no":"55555555555555","Name":"Mateen"},

     {"ref_no":"66666666666666","Name":"Omar"},

     {"ref_no":"77777777777777","Name":"Usama"}

     ]}

Below is my layout for spinner

<Spinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/dd_ref"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

I want to get ref_no from JSON file and show them into the spinner.

Update 1

After reading the answers and suggestions i have done the following

ArrayList<String> refList;

public static final String LOG_TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    try {
        loadData();
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

public void loadData() throws JSONException {
    JSONArray jsonArray;
    JSONObject jobj;


   try
   {
       jobj = new JSONObject(loadJSONFromAssest());
       jsonArray = jobj.getJSONArray("reference");

       for(int i = 0; i<jsonArray.length();i++)
       {
           jobj = jsonArray.getJSONObject(i);
           Log.d("Details-->", jobj.getString("ref_no"));
           String ref = jobj.getString("ref_no");

           refList.add(ref);
       }


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

    dd_ref.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, refList));


    dd_ref.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            refr_no = String.valueOf(refList.get(position));

            Log.i(LOG_TAG,refr_no);

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

}

public String loadJSONFromAssest() {

    String json = " ";

    try{
        InputStream is = getAssets().open("ref.json");

        int size = is.available();

        byte[] buffer = new byte[size];

        is.read(buffer);
        is.close();

        json = new String(buffer, "UTF-8");
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }

    return json;


}

When i run the application i get the following error

 FATAL EXCEPTION: main
                                                                           Process: com.example.accurat.application, PID: 7336
                                                                           java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.accurat.application/com.example.accurat.application.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference
                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2442)
                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2506)
                                                                               at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                               at android.os.Looper.loop(Looper.java:148)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5491)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
                                                                            Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference
                                                                               at com.example.accurat.application.MainActivity.loadData(MainActivity.java:59)
                                                                               at com.example.accurat.application.MainActivity.onCreate(MainActivity.java:37)
                                                                               at android.app.Activity.performCreate(Activity.java:6270)
                                                                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)
                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2395)
                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2506) 
                                                                               at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                               at android.os.Looper.loop(Looper.java:148) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5491) 
                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

Below is the image for my debugging

enter image description here

The error is at refList.add(ref); as it tells that the refList is null.

I am stuck to it and didn't know how to do it.

Any help would be highly appreciated.

Community
  • 1
  • 1
Moeez
  • 494
  • 9
  • 55
  • 147
  • check this out http://www.androidbegin.com/tutorial/android-populating-spinner-json-tutorial/ – Skizo-ozᴉʞS ツ Feb 26 '17 at 11:28
  • Possible duplicate of [Android Java; How can I parse a local JSON file from assets folder into a ListView](http://stackoverflow.com/questions/19945411/android-java-how-can-i-parse-a-local-json-file-from-assets-folder-into-a-listvi) – Pradeep Kumar Kushwaha Feb 26 '17 at 11:29
  • @Skizo-ozᴉʞS thanks for the comment, but it uses a URL and i don't want to use web service i just want to use my local json file. – Moeez Feb 26 '17 at 11:30

3 Answers3

2

In order to load a json file from assets folder you can use these methods:

public static JSONObject loadJsonObjectFromAsset(String assetName) {
    try {
        String json = loadStringFromAsset(assetName);
        if (json != null)
            return new JSONObject(json);
    } catch (Exception e) {
        Log.e("JsonUtils", e.toString());
    }

    return null;
}

private static String loadStringFromAsset(String assetName) throws Exception {
    InputStream is = CraveApplication.getContext().getAssets().open(assetName);
    int size = is.available();
    byte[] buffer = new byte[size];
    is.read(buffer);
    is.close();
    return new String(buffer, "UTF-8");
}

and just call:

JSONObject json = loadJsonObjectFromAsset("ref.json");

The second step will be to parse this json object and create a list:

JSONObject json = loadJsonObjectFromAsset("ref.json");
List<String> refList = new ArrayList<>();
try {
    JSONArray refArray = json.getJSONArray("reference");
    for(int i = 0; i< refArray.length(); i++){
        String ref = refArray.getJSONObject(i).getString("ref_no");
        refList.add(ref);
    }

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

And the final step will be to populate the spinner with the new list that we've created:

Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
        this, 
        android.R.layout.simple_spinner_dropdown_item, 
        refList);
spinner.setAdapter(arrayAdapter);
CookieMonster
  • 1,723
  • 1
  • 15
  • 15
1

try this

public void methodName() throws JSONException {

    ArrayList<String> spinnerArray  =new ArrayList<String>();

    final JSONArray ja = new JSONObject(loadJSONFromAsset()).getJSONArray("reference");

    for (int q = 0; q < ja.getJSONArray(0).length(); q++) {
        //String name = ja.getJSONArray(0).getJSONObject(q).getString("Name");
        String refNo = ja.getJSONArray(0).getJSONObject(q).getString("ref_no");
        spinnerArray.add(refNo);
    }

    //set spinnerArray in spinner adapter 

}


public String loadJSONFromAsset() {
    String json = null;
    try {

        InputStream is = context_.getAssets().open("file_name.json");

        int size = is.available();

        byte[] buffer = new byte[size];

        is.read(buffer);

        is.close();

        json = new String(buffer, "UTF-8");


    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    }
    return json;

}
sajan
  • 389
  • 5
  • 11
1

You can do it by adding Gson Library to your build.gradle

compile 'com.google.code.gson:gson:2.8.0'


//Create a model class     
public class Reference
{
   @SerializedName ("ref_no")
   public String ref_no;

   @SerializedName ("ref_no")
   public String ref_no;
}

public void getListFromJsonFile()
{
   Gson gson = new Gson();
   JsonReader reader = new JsonReader(new FileReader("file_name.json"));
   List<Reference> data = gson.fromJson(reader, new TypeToken<List<Review>>() {}.getType());
}
Ali Safdar
  • 36
  • 3
  • `JsonReader reader = new JsonReader(new FileReader("file_name.json"));` does it reads from assets folder? – Moeez Feb 26 '17 at 13:15