将JSON解析为对象

时间:2017-06-04 22:00:44

标签: java json gson

我尝试使用gson解析此JSON:

{"hvs1":{"16191":[["TestFile3","C",["A"]],["TestFile3","-",["1G","1A"]]],"16193":[["TestFile3","C",["G"]]]},"hvs2":{"25":[["TestFile3","-",["1A"]]]},"outros":{"16423":[["TestFile3","A",["T"]]]}}

进入此对象

public class Results {

private String regiaoAfetada;
private String posicaoReferencia;
private String nomeDoArquivo;
private String baseAlteradaReferencia;
private List<String> mutacaoEncontrada;

//get and set

}

我的测试课试图解决这个问题,但我收到了错误。

public class JsonTeste {

  public static void main(String[] args) {

        Gson gson = new Gson();

        try (Reader reader = new FileReader("foobar.json")) {

        Type type = new TypeToken<TreeMap<String, TreeMap>>() {
        }.getType();

        TreeMap<String, TreeMap<String, List<List<List<String>>>>> map = gson.fromJson(reader, type);

        List<Results> listaMutacoes = new ArrayList<Results>();

        for (Entry<String, TreeMap<String, List<List<List<String>>>>> regioesMap : map.entrySet()) {

            TreeMap<String, List<List<List<String>>>> regiaoUm = regioesMap.getValue();

            for (Entry<String, List<List<List<String>>>> regiaoUmResult : regiaoUm.entrySet()) {

                List<List<List<String>>> resultados = regiaoUmResult.getValue();

                for (List<List<String>> list : resultados) {

                    Results resultado = new Results();
                    resultado.setRegiaoAfetada(regioesMap.getKey());
                    resultado.setPosicaoReferencia(regiaoUmResult.getKey());
                    resultado.setNomeDoArquivo(list.get(0).toString());
                    resultado.setBaseAlteradaReferencia(list.get(1).toString());
                    resultado.setMutacaoEncontrada(list.get(2));
                    listaMutacoes.add(resultado);
                }
            }
        }

        } catch (IOException e) {
        e.printStackTrace();
    }

}
}

问题是当我尝试解析这部分时

 [
         "TestFile3",
         "-",
         [
           "1G",
           "1A"
         ]
       ]

因为我里面有两个字符串和一个数组,所以问题是当我尝试放置&#34; TestFile3&#34;到setNomeDoArquivo,但即使我评论这一行,我在第二行得到相同的错误。

resultado.setNomeDoArquivo(list.get(0)的ToString());                         resultado.setBaseAlteradaReferencia(list.get(1)的ToString());

java.lang.ClassCastException:java.lang.String无法强制转换为java.util.List

你们能帮助我吗?

1 个答案:

答案 0 :(得分:1)

列表resultados属于List<string>List<List<String>>。当您获得resultados项时,它可以是其中之一。因此,为了概括,将其声明为List<List<Object>>

尝试以下代码:

Gson gson = new Gson();
try (Reader reader = new FileReader("foobar.json")) {
    Type type = new TypeToken<TreeMap<String, TreeMap>>() {
    }.getType();

    TreeMap<String, TreeMap<String, List<List<Object>>>> map = gson.fromJson(reader, type);

    List<Results> listaMutacoes = new ArrayList<>();

    for (Map.Entry<String, TreeMap<String, List<List<Object>>>> regioesMap : map.entrySet()) {

        TreeMap<String, List<List<Object>>> regiaoUm = regioesMap.getValue();

        for (Map.Entry<String, List<List<Object>>> regiaoUmResult : regiaoUm.entrySet()) {

            List<List<Object>> resultados = regiaoUmResult.getValue();

            for (List<Object> list : resultados) {

                System.out.println(list);

                Results resultado = new Results();
                resultado.setRegiaoAfetada(regioesMap.getKey());
                resultado.setPosicaoReferencia(regiaoUmResult.getKey());
                resultado.setNomeDoArquivo((String) list.get(0));
                resultado.setBaseAlteradaReferencia((String) list.get(1));
                resultado.setMutacaoEncontrada((List<String>) list.get(2));
                listaMutacoes.add(resultado);
            }
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}