首页 > 解决方案 > 如何仅将选定的 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;
    }

}
  1. 类别
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."]
 }]

标签: javaandroidjson

解决方案


推荐阅读