java - 如何仅将选定的 JSON 对象解析为选定的模型
问题描述
我正在尝试从我的 Android 应用程序中的 JSON 读取数据并将其添加到我的模型中以显示它们ExpandableListView
我已将该 JSON 文件保存在我的资产文件夹中并使用 GSON 读取该数据,但我有两个模型类,我想在不同的模型类中存储不同的 JSON 对象,但在所有教程中,人们只使用单个模型类。它对我不起作用。这是我的代码:我正在读取数据的片段。
package com.saikariapps.localforvocal.fragments;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ExpandableListView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.google.android.material.appbar.AppBarLayout;
import com.google.gson.Gson;
import com.saikariapps.localforvocal.R;
import com.saikariapps.localforvocal.adapters.ListViewAdapter;
import com.saikariapps.localforvocal.models.Categories;
import com.saikariapps.localforvocal.models.Products;
import com.saikariapps.localforvocal.utils.Utils;
import java.util.ArrayList;
import java.util.Locale;
public class HomeFragment extends Fragment {
private EditText searchText;
private ListViewAdapter adapter;
private ExpandableListView elvInvestments;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_home, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
searchText = view.findViewById(R.id.search_view);
elvInvestments = view.findViewById(R.id.elvProducts);
ArrayList<Categories> categories = new ArrayList<>();
categories = populateCategoriesData(categories);
adapter = new ListViewAdapter(getActivity(), categories);
elvInvestments.setAdapter(adapter);
String jsonFileString = Utils.getJsonFromAssets(getContext(), "products.json");
// assert jsonFileString != null;
Log.i("my_data", jsonFileString);
Gson gson = new Gson();
}
private ArrayList<Categories> populateCategoriesData(ArrayList<Categories> categories){
//This is how I was maualy populating data earlier now I want to this from JSON File.
Categories lstCat1 = new Categories("COLD DRINK", R.drawable.ic_home,null);
ArrayList<Products> catPro1 = new ArrayList<>();
catPro1.add(new Products("Coke", "Rose Drink(Sherbat)"));
catPro1.add(new Products("Fanta", "Roohafza"));
catPro1.add(new Products("Sprite", "Rasna"));
catPro1.add(new Products("Thumbsup", "Frooti"));
catPro1.add(new Products("Limca", "Godrej Jumpin"));
catPro1.add(new Products("Goldpat", "yoghurt"));
catPro1.add(new Products("7up", "Jaljeera"));
catPro1.add(new Products("Mirinda", "Juice"));
catPro1.add(new Products("Slice", "Coconut"));
catPro1.add(new Products("Coca Cola", "Thandai"));
catPro1.add(new Products("Pepsi", "Lemonade"));
lstCat1.setProducts(catPro1);
categories.add(lstCat1);
Categories lstCat2 = new Categories("TEA", R.drawable.ic_info,null);
ArrayList<Products> catPro2 = new ArrayList<>();
catPro2.add(new Products("Lipton", "Divya Peya(Patanjali)"));
catPro2.add(new Products("BrookBond(Red Label)", "Tata"));
catPro2.add(new Products("BrookBond(Taj Mahal)", "Brahmaputra"));
catPro2.add(new Products("Godfrey Philip", "Aasam"));
catPro2.add(new Products("Polsan", "Girnaar"));
catPro2.add(new Products("Goodrick", "Indian Cafe"));
catPro2.add(new Products("Sunrise", "M.R."));
catPro2.add(new Products("Nestle", ""));
catPro2.add(new Products("Nescafe", ""));
lstCat2.setProducts(catPro2);
categories.add(lstCat2);
Categories lstCat3 = new Categories("CHILD FOOD", R.drawable.ic_share,null);
ArrayList<Products> catPro3 = new ArrayList<>();
catPro3.add(new Products("Nestle(Lactogen)", "Amul"));
catPro3.add(new Products("Nestle(Cerelac)", "Sagar"));
catPro3.add(new Products("Nestle(Nestam)", "Tapan"));
catPro3.add(new Products("Nestle(L.P.F)", "Milk Care"));
catPro3.add(new Products("Nestle(Milkmaid)", "Honey"));
catPro3.add(new Products("Nestle(Eaveryday)", "Fruit Juice"));
catPro3.add(new Products("Nestle(Galtco)", "forPro2"));
catPro3.add(new Products("GlaksoSmithCline(Farex)", "forPro3"));
catPro3.add(new Products("indPro4", "forPro4"));
catPro3.add(new Products("indPro2", "forPro2"));
catPro3.add(new Products("indPro3", "forPro3"));
catPro3.add(new Products("indPro4", "forPro4"));
lstCat3.setProducts(catPro3);
categories.add(lstCat3);
searchText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
adapter.fiterData(searchText.getText().toString().toLowerCase(Locale.getDefault()));
int counts = adapter.getGroupCount();
for (int i = 0; i<counts; i++) {
elvInvestments.expandGroup(i);
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.fiterData(searchText.getText().toString().toLowerCase(Locale.getDefault()));
int counts = adapter.getGroupCount();
for (int i = 0; i<counts; i++) {
elvInvestments.expandGroup(i);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
return categories;
}
}
这是我用于读取 JSON 文件的 utils 类。
package com.saikariapps.localforvocal.utils;
import android.content.Context;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
public class Utils {
public static String getJsonFromAssets(Context context, String fileName) {
String jsonString;
try {
InputStream is = context.getAssets().open(fileName);
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
jsonString = new String(buffer, StandardCharsets.UTF_8);
} catch (IOException e) {
e.printStackTrace();
return null;
}
return jsonString;
}
}
这些是我的模型类: 1. 产品。
package com.saikariapps.localforvocal.models;
public class Products {
private String iName, fName;
public Products(String iName, String fName) {
this.iName = iName;
this.fName = fName;
}
public void setName(String iName) {
this.iName = iName;
}
public String getName() {
return iName;
}
public void setAmount(String fName) {
this.fName = fName;
}
public String getAmount() {
return fName;
}
}
- 类别
package com.saikariapps.localforvocal.models;
import java.util.ArrayList;
public class Categories {
private String catName;
private int catThumb;
private ArrayList<Products> products;
public Categories(String catName, int catThumb, ArrayList<Products> products) {
this.catName = catName;
this.catThumb = catThumb;
this.products = products;
}
public ArrayList<Products> getProducts() {
return products;
}
public void setProducts(ArrayList<Products> products) {
this.products = products;
}
public String getCatName() {
return catName;
}
public void setCatName(String catName) {
this.catName = catName;
}
public int getCatThumb() {
return catThumb;
}
public void setCatThumb(int catThumb) {
this.catThumb = catThumb;
}
}
这是我的 JSON 文件:
[
{
"Product": [" Toothpaste / powder" ],
"Type_1": [" MDH", "Vicco Vajradanti", "Baidhyanath", "Choice", "Neem", "Anchor", "Dabur’s Red", "Meswak and Babool", "Promise", "Dant*Kanti / Dant manjan (Patanjali)", "Babul", "Ajay", "Herbodent", "Ajanta", "Garware", "Classic", "Eagle", "Bandar Chap", "Baidyanath", "Emami and products of small scale and cottage industries." ],
"Type_2": [" Most toothpastes made from bone powder. Colgate", "Hindustan Uni-Liver (Closeup", "pepsodent", "aim", "cibaca,) aqua fresh", "Amway (Forhans)", "Oral B", "Quantum etc. MOST SUCH TOOTH PASTE HAVE THE DEADLY POISON FLUORIDE."]
},
{
"Product": [" Tooth Brush" ],
"Type_1": [" Promise", "Ajay", "Ajanta", "Monet", "Royal", "Classic", "Dr. Stroke", "Patanjali," ],
"Type_2": [" Colgate", "Close up", "Pepsodent", "Aqua fresh", "Cibaca", "Oral-B etc."]
},
{
"Product": [" Bathing soap" ],
"Type_1": [" Medimix", "Neem", "Nima", "Jasmine", "Mysore Sandal", "Kutir", "Sahara", "Himani Glycerin", "Cinthol (Godrej)", "Fair Flow", "Ganga", "Wipro", "Park Avenue", "Kaya Kanti* / Kaya Kanti Aloe Vera*", "Santoor", "Nirma", "Swastik", "Wipro sikakai", "patanjali and products of small scale and Cottage industries." ],
"Type_2": [" Hindustan Uni-Lever (Lux", "Liril", "Lifebuoy", "Le Sancy", "Denim", "Chemie", "Dove", "Revlon", "Pears", "Rexona", "Hamam", "OK", "Ponds) Dettol", "Clearasil", "Palmolive", "Amway", "Johnson Baby etc."]
}]
解决方案
推荐阅读
- apache-spark - Spark Streaming 在 DStream 上异步运行操作
- ms-access - MS Access 恢复功能
- reactjs - 使用 TS 的 Redux DevTools 扩展出错:“属性 '__REDUX_DEVTOOLS_EXTENSION_COMPOSE__' 在类型 'Window' 上不存在。”?
- java - 如果仍然抛出 OverlappingFileLockException,那么在 FileChannel.lock 中等待的目的是什么?
- makefile - 从另一个文件夹收集文件
- r - R XML 包,getNodeSet 的命名空间
- sql-server - 当我在 SQL Server 中的两个日期之间选择时,结果是从范围内和范围外一起返回的?
- php - 关于内容的 wordpress 循环说明
- python-2.7 - Tensorflow 无限期地运行“按图像评估运行”
- makefile - Makefile:换行符/续行符用法:`\`,一般可以接受还是不接受?