java - 使用 GSON 反序列化 JSON 文件

标签 java android json gson

我开发了一个 Android 应用程序,我必须反序列化一个 JSON 文件。 我有这些类(class):

public class Medicine {

    @SerializedName("substanta_activa")
    private List<String> active_substance;
    @SerializedName("produse")
    private List<Product> product;
    @SerializedName("dozaj")
    private Dosage dosage;
    @SerializedName("mentiuni")
    private List<String> notes;
    @SerializedName("cuvinte_cheie")
    private List<String> keyword;

    /* + getters and setters */
}
<小时/>
public class Product {

    @SerializedName("denumire_comerciala")
    private String productName;

    @SerializedName("forme_de_prezentare")
    private List<String> form;

    /* + getters and setters */
}
<小时/>
public class Dosage {
    @SerializedName("nounascuti")
    private String newborn;

    @SerializedName("copii")
    private String child;

    @SerializedName("adulti")
    private String adult;

    /* + getters and setters */
}

我有以下 JSON 文件:

[
    {
        "substanta_activa": [
            "trimebutinum"
        ],
        "produse": [
            {
                "denumire_comerciala": "Debridat",
                "forme_de_prezentare": [
                    "susp. buvabilă",
                    "susp. 24mg/5ml în flac 250ml",
                    "compr 100mg"
                ]
            },
            {
                "denumire_comerciala": "Ibutin",
                "forme_de_prezentare": [
                    "compr 300mg"
                ]
            },
            {
                "denumire_comerciala": "Trimebutin",
                "forme_de_prezentare": [
                    "compr 100mg"
                ]
            },
            {
                "denumire_comerciala": "Colperin",
                "forme_de_prezentare": [
                    "compr 100mg"
                ]
            }
        ],
        "dozaj": {
            "nounascuti": "1ml/kg/zi div 3,",
            "copii": "1ml/kg/zi div 3, peste 5 ani 3x10ml",
            "adulti": "3x1-2 compr/zi, 1x300mg/zi sau 3x1-2 lingură/zi"
        },
        "mentiuni": [
            "se poate administra de la naștere",
            "se poate administra amestecat cu apă, lapte",
            "10ml conține 6g zahăr"
        ],
        "cuvinte_cheie": [
            "gastro",
            "colică",
            "dureri abdominale funcționale",
            "constipație"
        ]
    },
    {
        "substanta_activa": [
            "benzydaminum"
        ],
        "produse": [
            {
                "denumire_comerciala": "Tantum Verde comprimate",
                "forme_de_prezentare": [
                    "pastile pt supt 3mg"
                ]
            },
            {
                "denumire_comerciala": "Tantum Verde spray",
                "forme_de_prezentare": [
                    "spray bucofaringian 0,15%, 0,3%"
                ]
            }
        ],
        "dozaj": {
            "nounascuti": "contraindicat",
            "copii": "2-6 ani: 2-6x1 puf/4kg; >6 sni: 2-6x 4doze sau 3x1 pastila/zi",
            "adulti": "2-6x 4puf sau 3x1 pastila/zi"
        },
        "mentiuni": [
            "se admin. max. 7 zile"
        ],
        "cuvinte_cheie": [
            "antiseptic, anestezic, antiinflamator, oral, OTC"
        ]
    }
]

我尝试了多种方法,使用 GSON 或不使用 GSON,但都没有成功。感谢您提前提供的帮助。

编辑

更详细一点: 我有一个 MainPageActivity,在其中初始化一个输入流、设置一个路径并从 JSONParser 类调用我的反序列化方法:

InputStream is = null;
String internalStoragePath = getApplicationContext().getFilesDir().getAbsolutePath();
File fileToInternalStorage = new File(internalStoragePath + "/medicinelist.json");
try {
     is = new FileInputStream(fileToInternalStorage);
} catch (FileNotFoundException e) {
     e.printStackTrace();
} catch (IOException e) {
     e.printStackTrace();
}
if (is == null) {
     is = getResources().openRawResource(R.raw.gyogyszerek);
}
jsonParser = new JSONParser();
try {
     medicines = jsonParser.readJsonStream(getApplicationContext(), is);
     //medicines = jsonParser.jsonDeserializer(getApplicationContext(), is);
     is.close();
} catch (IOException e) {
     e.printStackTrace();
}

在我的 JSONParser 类中,正如我所提到的,我尝试了多种方法来反序列化 JSON 输入。 这是“传统”方式,使用 Android 内置的 JsonReader 类(抱歉,有点长):

public ArrayList readJsonStream(Context applicationContext, InputStream in) throws IOException {
    JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));

    try {
        return readMedicineArray(reader);
    } finally {
        reader.close();
    }
}


public ArrayList readMedicineArray(JsonReader reader) throws IOException {
    ArrayList medicines = new ArrayList();
    reader.beginArray();
    while (reader.hasNext()) {
        medicines.add(readMedicine(reader));
    }
    reader.endArray();
    return medicines;
}

public Medicine readMedicine(JsonReader reader) throws IOException {
    List active_substance = null;
    List product = null;
    Dosage dosage = null;
    List notes = null;
    List keyword = null;

    reader.beginObject();
    while (reader.hasNext()) {
        String name = reader.nextName();

        if (name.equals("substanta_activa")) {
            active_substance = readActiveSubstanceArray(reader);
        } else if (name.equals("produse")) {
            product = readProductArray(reader);
        } else if (name.equals("dozaj")) {
            dosage = readDosage (reader);
        } else if (name.equals("mentiuni") && reader.peek() != JsonToken.NULL) { 
            notes= readNotesArray(reader);
        } else if (name.equals("cuvinte_cheie") && reader.peek() != JsonToken.NULL) {
            keyword = readKeywordArray(reader);
        } else {
            reader.skipValue();
        }
    }
    reader.endObject();
    return new Medicine(active_substance, product, dosage, notes, keyword);
}

public List readActiveSubstanceArray(JsonReader reader) throws IOException {
    List active_substance = new ArrayList();

    reader.beginArray();
    while (reader.hasNext()) {
        active_substance.add(reader.nextString());
    }
    reader.endArray();
    return active_substance;
}

public List readProductArray(JsonReader reader) throws IOException {
    List product = new ArrayList();

    reader.beginArray();
    while (reader.hasNext()) {
        product.add(readProduct(reader));
    }
    reader.endArray();
    return product;
}

public Product readProduct(JsonReader reader) throws IOException {
    String productName = null;
    List form = null;

    reader.beginObject();
    while (reader.hasNext()) {
        String name = reader.nextName();
        if (name.equals("denumire_comerciala")) {
            productName = reader.nextString();
        } else if (name.equals("forme_de_prezentare")) {
            form = readFormArray(reader);
        } else {
            reader.skipValue();
        }
    }
    reader.endObject();
    return new Product(productName, form);
}

public List readFormArray(JsonReader reader) throws IOException {
    List form = new ArrayList();

    reader.beginArray();
    while (reader.hasNext()) {
        form.add(reader.nextString());
    }
    reader.endArray();
    return form;
}

public Dosage readDosage(JsonReader reader) throws IOException {
    String newborn= null;
    String child= null;
    String adult= null;

    reader.beginObject();
    while (reader.hasNext()) {
        String name = reader.nextName();
        if (name.equals("nounascuti")) {
            newborn= reader.nextString();
        } else if (name.equals("copii")) {
            child= reader.nextString();
        } else if (name.equals("adulti")) {
            adult= reader.nextString();
        } else {
            reader.skipValue();
        }
    }
    reader.endObject();
    return new Dosage(newborn, child, adult);
}

public List readNotesArray(JsonReader reader) throws IOException {
    List notes= new ArrayList();

    reader.beginArray();
    while (reader.hasNext()) {
        notes.add(reader.nextString());
    }
    reader.endArray();
    return notes;
}

public List readKeywordArray(JsonReader reader) throws IOException {
    List keyword= new ArrayList();

    reader.beginArray();
    while (reader.hasNext()) {
        keyword.add(reader.nextString());
    }
    reader.endArray();
    return keyword;
}

这是 GSON 库的另一种方式:

public ArrayList<Medicine> jsonDeserializer(Context contexts, InputStream in) throws IOException {
      Reader reader = new InputStreamReader(in);

      ArrayList medicinesList = new ArrayList();
      final GsonBuilder gsonBuilder = new GsonBuilder();
      final Gson gson = gsonBuilder.create();

      Medicine[] medicinesArray = new Gson().fromJson(reader, Medicine[].class);
      for(int i = 0; i < medicinesArray.length; ++i){
          medicinesList.add(medicinesArray[i]);
      }

      return medicinesList;
}

它们都不起作用,但我不知道问题出在哪里。

最佳答案

//试试这个

    Gson gson = new Gson();
    Type listType = new TypeToken<ArrayList<Medicine>>() {}.getType();
    List<Medicine> medList = gson.fromJson(<YOUR JSON STRING>, listType);

关于java - 使用 GSON 反序列化 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29909822/

相关文章:

javascript - 将 csv 解析为具有额外属性的对象

java - 无法通过 Android 中的 SharedPreferences 保存数据

java - 如何从java程序(即以编程方式)将用户输入发送到终端?

java - 检查操作栏如何可见?

c# - 使用 JavaScriptSerializer 格式化 JSON

java - 用于接口(interface)的 Kafka JSON 反序列化器

java - JVM 性能指标

java - 我的代码有什么问题吗?做 while 并 try catch

android - 从 youtube 返回到我的 android 应用程序

Android 4.2.2 adb 找不到设备