Java GSON&x2B;从webservice解析json并获取特定JsonObject的json字符串

Java GSON&x2B;从webservice解析json并获取特定JsonObject的json字符串,java,json,gson,Java,Json,Gson,我有一个从webservice读取json的场景。这个Json是一个包含大量数据的节点数组 我想要达到的目标: 对于数组中的每个节点,只读必需元素。使用GSON对象模型完成此操作 对于数组中的每个节点,需要该特定节点的Json字符串,并将其作为字符串从步骤1添加到Java对象中 步骤2是必需的,因为Java impl将调用另一个服务,而该服务反过来需要每个节点的json进行进一步处理 我为实现这一目标所做的努力: 使用步骤1的对象模型创建java对象 使用带有JsonArray.class的对象

我有一个从webservice读取json的场景。这个Json是一个包含大量数据的节点数组

我想要达到的目标:

  • 对于数组中的每个节点,只读必需元素。使用GSON对象模型完成此操作
  • 对于数组中的每个节点,需要该特定节点的Json字符串,并将其作为字符串从步骤1添加到Java对象中 步骤2是必需的,因为Java impl将调用另一个服务,而该服务反过来需要每个节点的json进行进一步处理

    我为实现这一目标所做的努力:

  • 使用步骤1的对象模型创建java对象
  • 使用带有JsonArray.class的对象模型再次读取整个json,它为每个节点(JsonArray.get(i).toString())提供json字符串
  • 找到一种匹配Json字符串和Java对象的方法,可以使用节点id,这同样需要从第2步开始解析
  • 我的问题是:

  • 我是否使用了正确的方法?两次解析Json可以吗?有没有更好的方法来实现这一点
  • 我不喜欢使用JsonReader,但这是一个更好的解决方案吗?如果是,如何证明
  • staff.json:

    [
    {
        "name": "Joe",
        "age" : 35,
        "position": "dev",
        "salary": 10000,
        "skills":[ "angular", "aws", "java"],
        "Organistaion" : "Test",
        "WorkType": "Full-time"
    },
    
    {
        "name": "John",
        "age" : 29,
        "position": "dev",
        "salary": 10000,
        "skills":[ "python", "c#", "java"],
        "Organistaion" : "Test",
        "WorkType": "Full-time"
    }
    
    ]

    Staff.java:

    public class Staff {
    private String name;
    private int age;
    private String staffJson;
    .......
    
    }

    StaffSandbox.java:

    public class StaffSandbox {
    public static void main (String s[]) {
        Gson gson = new Gson();
    
        try (Reader reader = new FileReader("C:\\staff.json")) { // for sample code use file
    
            // Step 1
            List<Staff> staffs = gson.fromJson(reader, new TypeToken<List<Staff>>() {}.getType());
            staffs.forEach(System.out::println);
    
            // Step 2
            String json = new String(Files.readAllBytes(Paths.get(("C:\\staff.json"))));
            JsonArray jsonElement = gson.fromJson(json, JsonArray.class);
            System.out.println( gson.toJson(jsonElement.get(0)).toString());
    
            // Step 3
            for (int i = 0; i < json.size(); i++) {
                // Read the node Id and match with corresponding Staff object and add the json to it            
            }
    
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    公共类StaffSandbox{
    公共静态void main(字符串s[]{
    Gson Gson=新的Gson();
    请尝试(Reader=newfilereader(“C:\\staff.json”){//,以获取示例代码使用文件
    //第一步
    List staff=gson.fromJson(reader,new-TypeToken(){}.getType());
    forEach(System.out::println);
    //步骤2
    String json=新字符串(Files.readAllBytes(path.get(((“C:\\staff.json”)));
    JsonArray jsonElement=gson.fromJson(json,JsonArray.class);
    System.out.println(gson.toJson(jsonElement.get(0)).toString());
    //步骤3
    for(int i=0;i
    }

    我是否使用了正确的方法?两次解析Json可以吗?有没有更好的方法来实现这一点

    不是真的。您可以避免两次读取该文件,并在第二次读取时节省大量内存:您正在将整个文件读取到字节数组,首先将其转换为字符串,然后再转换为JSON数组。对大型文件测试这种方法,您可能会遇到
    OutOfMemoryError

    我不喜欢使用JsonReader,但这是一个更好的解决方案吗?如果是,如何证明

    JsonReader
    以流式方式将JSON输入标记化,在许多情况下,它可以为您提供很多帮助

    如果我理解正确,你只需要这样:

    private static void-zip(最终Gson-Gson、最终阅读器、最终消费者