Хорошо, допустим, у меня есть 3 объекта. Объект A, объект B и объект C.

И у меня есть 3 файла json, каждый из которых имеет только один тип объекта.

Могу ли я получить содержимое файлов только одним методом?

Что-то вроде этого:

public class jsonConverter {
   public static ArrayList<?> convertFromJson(String path, Object objectToConvertTo) {
    //Get the data in the JSON file
    Object all = new JSONParser().parse(new FileReader(path));
    //this line would not work 
    return new Gson().fromJson(all.toString(), new TypeToken<List<objectToConvertTo>>() {
    }.getType());
   }
}

И тогда я смогу получить Контент с помощью этого:

public class main{
     public static void main(String[] args) throws Exception {
        ArrayList<A> arrayListA = JsonConverter.convertFromJson("a.json", new A());

        ArrayList<B> arrayListB = JsonConverter.convertFromJson("b.json", new B());

        ArrayList<C> arrayListC = JsonConverter.convertFromJson("c.json", new C());
     }
}

Возможно ли что-то подобное? Или это будет работать, только если я использую один метод для каждого объекта индивидуально?

0
rocketcrafter 8 Мар 2021 в 23:00

1 ответ

Лучший ответ

По общему признанию, этот ответ - не совсем то, о чем вы спрашивали, поскольку он использовал Джексона вместо GSON, но, вероятно, достаточно близко. Строки List<A> a = mapper.readValue(aJson, new TypeReference<List<A>>() {}); очень близки к тому, что вы пытаетесь сделать в своем методе main():

@Test
public void testJsonParse() throws Exception {
    String aJson = "[{\"a\":1},{\"a\":2},{\"a\":3}]";
    String bJson = "[{\"b\":\"1\"},{\"b\":\"2\"},{\"b\":\"3\"}]";
    String cJson = "[{\"id\":1,\"name\":\"x\"},{\"id\":2,\"name\":\"y\"},{\"id\":3,\"name\":\"z\"}]";

    ObjectMapper mapper = new ObjectMapper();

    List<A> a = mapper.readValue(aJson, new TypeReference<List<A>>() {});
    List<B> b = mapper.readValue(bJson, new TypeReference<List<B>>() {});
    List<C> c = mapper.readValue(cJson, new TypeReference<List<C>>() {});
    System.out.println("a: " + a);
    System.out.println("b: " + b);
    System.out.println("c: " + c);
}

public static class A {
    public int a;
    @Override public String toString() { return "[a=" + a + "]"; }
}

public static class B {
    public String b;
    @Override public String toString() { return "[b=" + b + "]"; }
}

public static class C {
    public int id;
    public String name;
    @Override public String toString() { return "[id=" + id + ",name=" + name + "]"; }
}

Выход:

a: [[a=1], [a=2], [a=3]]
b: [[b=1], [b=2], [b=3]]
c: [[id=1,name=x], [id=2,name=y], [id=3,name=z]]
0
Erik 8 Мар 2021 в 20:26