Java 如何将项目从JSON文件显示到微调器

Java 如何将项目从JSON文件显示到微调器,java,android,json,Java,Android,Json,我试图在微调器上显示资产文件夹中json文件中的列表。我发现了一个教程,但我认为我的格式是错误的,请帮助! 此外,如果列表最多有300个项目,则此过程是否需要时间加载到微调器 这是我的主要活动 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(saved

我试图在微调器上显示资产文件夹中json文件中的列表。我发现了一个教程,但我认为我的格式是错误的,请帮助! 此外,如果列表最多有300个项目,则此过程是否需要时间加载到微调器

这是我的主要活动

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Spinner spinner = (Spinner)findViewById(R.id.spinner);
        ArrayList<String> items = getFood("food.json");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_layout, R.id.txt, items);
        spinner.setAdapter(adapter);
    }

    public ArrayList<String> getBanks(String fileName) {
        JSONObject jsonObject = null;

        try {
            InputStream is = getResources().getAssets().open(fileName);
            int size = is.available();
            byte[] data = new byte[size];
            is.read(data);
            is.close();
            String json = new String(data, "UTF-8");
            jsonObject = new JSONObject(json);

            if (jsonObject != null) {
                for (int i = 0; i < jsonObject.length(); i++) {

                  JSONArray foodList = jsonObject.getJSONArray("data");
                    if(cList != null){
                        for(int j=0; i<cList.length(); j++){
                            JSONObject fList = foodList.getJSONObject(j);
                            String food_name = foodList.getString("name");
                            String food_code = foodList.getString("code");

                        }
                    }
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException je) {
            je.printStackTrace();
        }
        return cList;
    }
}


为什么不为下面的结构创建一个自定义类

{
      "code": "11",
      "id": 1,
      "name": "Apple"
}
这样,您就可以使用GSON库使用TypeToken将json解析到一个列表中,并且很容易将其传递给适配器

你可以这样做

List<YourClass> yourClass = Gson().fromJson(json.toString(),new TypeToken<List<YourClass>>(){}.getType()) 
List yourClass=Gson().fromJson(json.toString(),new-TypeToken(){}.getType())

为什么不为以下结构创建一个自定义类

{
      "code": "11",
      "id": 1,
      "name": "Apple"
}
这样,您就可以使用GSON库使用TypeToken将json解析到一个列表中,并且很容易将其传递给适配器

你可以这样做

List<YourClass> yourClass = Gson().fromJson(json.toString(),new TypeToken<List<YourClass>>(){}.getType()) 
List yourClass=Gson().fromJson(json.toString(),new-TypeToken(){}.getType())
用于此任务(大小非常小,比其他库(如Gson、Jasckson core…)更快)

考虑到性能,它是比其他方法更好的选择


现在让我们来看解决方案

首先将jackson jr库导入到您的android项目中

implementation 'com.fasterxml.jackson.jr:jackson-jr-objects:2.10.0'
然后像这样创建两个模型类

public class Food {
    private String status;
    private List<Data> data;
    private String message;

    public Food() {
    }

    //getters and setters
}

public class Data {
    private String code;
    private int id;
    private String name;

    public Data() {
    }

    //getters and setters
}
import com.fasterxml.jackson.jr.ob.JSON;

private List<Data> getData() {
    List<Data> data = null;
    try {
        // give your json file as a inputstream
        //InputStream is = getResources().openRawResource(R.raw.food); 
        InputStream is = getResources().getAssets().open("food.json");
        Food bean = JSON.std.beanFrom(Food.class, is);
        data = bean.getData();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return data;
}
下面是
getFoodNamesFromData()
方法

private List<String> getFoodNamesFromData(List<Data> dataList) {
    List<String> foodNames = new ArrayList<>();

    for(Data data :dataList){
        String foodName = data.getName();
        foodNames.add(foodName);
    }

    return foodNames;
}
私有列表getFoodNamesFromData(列表数据列表){
List foodNames=new ArrayList();
用于(数据:数据列表){
字符串foodName=data.getName();
添加(foodName);
}
返回食物名称;
}
快乐编码

对于此任务使用(大小非常小,比其他库(如Gson、Jasckson core…)更快)

考虑到性能,它是比其他方法更好的选择


现在让我们来看解决方案

首先将jackson jr库导入到您的android项目中

implementation 'com.fasterxml.jackson.jr:jackson-jr-objects:2.10.0'
然后像这样创建两个模型类

public class Food {
    private String status;
    private List<Data> data;
    private String message;

    public Food() {
    }

    //getters and setters
}

public class Data {
    private String code;
    private int id;
    private String name;

    public Data() {
    }

    //getters and setters
}
import com.fasterxml.jackson.jr.ob.JSON;

private List<Data> getData() {
    List<Data> data = null;
    try {
        // give your json file as a inputstream
        //InputStream is = getResources().openRawResource(R.raw.food); 
        InputStream is = getResources().getAssets().open("food.json");
        Food bean = JSON.std.beanFrom(Food.class, is);
        data = bean.getData();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return data;
}
下面是
getFoodNamesFromData()
方法

private List<String> getFoodNamesFromData(List<Data> dataList) {
    List<String> foodNames = new ArrayList<>();

    for(Data data :dataList){
        String foodName = data.getName();
        foodNames.add(foodName);
    }

    return foodNames;
}
私有列表getFoodNamesFromData(列表数据列表){
List foodNames=new ArrayList();
用于(数据:数据列表){
字符串foodName=data.getName();
添加(foodName);
}
返回食物名称;
}

快乐编码

请问我如何转换成一门课?这个json文件是为一个项目提供的,我不知道怎么做。你可以这样做:``公共类YourClassName{@SerializedName(“code”)公共字符串code;@SerializedName(“id”)公共整数id;@SerializedName(“name”)公共字符串name;}```然后您可以使用它从提供的json文件中获取json列表。请问如何转换为类?这个json文件是为一个项目提供的,我不知道怎么做。你可以这样做:``公共类YourClassName{@SerializedName(“code”)公共字符串code;@SerializedName(“id”)公共整数id;@SerializedName(“name”)公共字符串name;}```然后您可以使用它从提供的json文件中获取json列表。我用您的food.json文件尝试了上面的代码,它对我来说运行良好。如果您遇到任何问题,请随时在此发表评论。谢谢您的回复,我对R.raw.food有疑问。raw无法识别。我将Json文件作为raw文件提供。您可以提供自己的输入流。尝试
InputStream is=getResources().getAssets().open(“food.json”)是的,这很有效!而且速度相当快。我如何只将食物名称传递给spinnerhi,我遇到了一个小问题,我正在尝试使用一种方法来获取代码。该方法仅在单击时获取字符串的值。但是foodlist一直抛出空指针,例外的是我用你的food.json文件尝试了上面的代码,对我来说效果很好。如果您遇到任何问题,请随时在此发表评论。谢谢您的回复,我对R.raw.food有疑问。raw无法识别。我将Json文件作为raw文件提供。您可以提供自己的输入流。尝试
InputStream is=getResources().getAssets().open(“food.json”)是的,这很有效!而且速度相当快。我如何只将食物名称传递给spinnerhi,我遇到了一个小问题,我正在尝试使用一种方法来获取代码。该方法仅在单击时获取字符串的值。但foodlist不断抛出空指针异常