2017-02-26 33 views
0

我是android开发的新手。我在android studio工作。我在我的assets文件夹中放置了一些json文件。现在我想将json文件中的数据填充到微调器中。我知道如何使用微调器并使用web service来填充数据,但我不知道如何使用json文件来完成。此外,我找不到任何教程,但是,我确实发现how to read data from json file,但我想在微调框中填充它。以下是我的json文件数据之一。使用json文件填充微调器而不使用web服务

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"} 

    ]} 

下面是我为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" /> 

我想从JSON文件ref_no,并显示他们进入微调布局。

更新1

阅读中,我也做了解答和建议后,以下

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; 


} 

当我运行该应用程序,我碰到下面的错误

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)  

下面是我的调试图像

enter image description here

错误在refList.add(ref);,因为它告诉refList为空。

我坚持它,不知道该怎么做。

任何帮助将不胜感激。

+0

检查一下http://www.androidbegin。com/tutorial/android-populating-spinner-json-tutorial/ –

+0

[Android Java;我怎样才能解析一个本地JSON文件从资产文件夹到ListView](http://stackoverflow.com/questions/19945411/android-java-how-can-i-parse-a-local-json-file-from- assets-folder-into-a-listvi) –

+0

@ Skizo-ozᴉʞS感谢您的评论,但它使用了一个URL,我不想使用web服务,我只想使用我的本地json文件。 – faisal1208

回答

1

为了从assets文件夹中加载JSON文件,你可以使用这些方法做到这一点:

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

只需拨打电话:

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

第二步将是解析此JSON对象,并创建一个列表:

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

,最后一步将与我们创建新的列表来填充微调:

Spinner spinner = (Spinner) findViewById(R.id.spinner); 
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
     this, 
     android.R.layout.simple_spinner_dropdown_item, 
     refList); 
spinner.setAdapter(arrayAdapter); 
+0

感谢您的答案,我已经尝试过你的代码,但在其他一些风格,我收到一个错误,你能看到我更新的代码? – faisal1208

+0

在向列表中添加新元素之前,您必须创建一个新列表: 列表 refList = new ArrayList <>(); – CookieMonster

+0

仍然面临同样的问题:( – faisal1208

1

试试这个

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; 

} 
+0

好吧,让我试试然后我会让你知道 – faisal1208

+0

我得到这个错误org.json.JSONException:值{“ref_no”:“11111111111111”,“名称”:“费萨尔”}在0类型org.json .JSONObject无法转换为JSONArray' – faisal1208

+0

它的点符合(int i = 0; i faisal1208

1

您可以通过添加GSON库到您的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()); 
} 
+0

'JsonReader reader = new JsonReader(new FileReader(“file_name.json”));'它是否从assets文件夹中读取? – faisal1208

+0

快速谷歌搜索http://stackoverflow.com/a/4789699/1950812 – fillobotto