【问题标题】:Parse a JSON string to an array using Jackson使用 Jackson 将 JSON 字符串解析为数组
【发布时间】:2021-07-19 05:53:35
【问题描述】:

我收到以下 JSON 响应:

[
{
    "name": "Assets",
    "id": "assets---0020",
    "elements": [
        {
            "name": "user generates an token",
            "steps": [
            {
                "name": "I have generated a common access token",
                "result": {
                    "duration": 1124800,
                    "status": "passed"
                }                    
            }
            ]
        },
        {
            "name": "user generates an token",
            "steps": [
            { 
                "name": "I have generated a common access token",
                "result": {
                    "duration": 1124800,
                    "status": "passed"
                }                    
            }
            ]
        },
        {
            "name": "User clicks on dropdown",
            "steps": [
            {
                "name": "User clicks on dropdown and selects option and api response printed",
                "result": {
                    "duration": 1124800,
                    "status": "failed"
                }
            }
            ]
        }
    ]    
}
]

我想要下面的输出:

Name: Assets
Total - 3
No Of Success - 2
No Of Failed - 1

我一直在尝试使用 Jackson 自动解析它,但几乎没有成功。我能够显示:

Name: Assets 

以下是我的主要 Java 类的代码:

package JsonToJava.test;

import java.io.File;
import java.io.IOException;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;

import com.fasterxml.jackson.databind.ObjectMapper;


public class JsontoJava
{

    public static void main( String[] args ) throws JsonMappingException, JsonProcessingException
    {        
       ObjectMapper mapper = new ObjectMapper();

       try {            
      
          Data[] dataObj  = mapper.readValue(new File("data/sample_array_data.json"), Data[].class);
       
      
          for (Data data: dataObj) {
           
             System.out.println("Track Name--->"+data.getName());
            
             System.out.println("Printing Elements--->"+data.getElements());
            
             System.out.println("------------------------");
          }
        } catch (JsonMappingException e) {
          e.printStackTrace();
        }catch (JsonProcessingException e) {
          e.printStackTrace();
        }catch (IOException e) {
          e.printStackTrace();
      } 
   }
}

但不知道如何循环元素并从中获取所需的数据。 有谁知道解决方案是什么?请帮忙。

【问题讨论】:

  • 如果您将 json 解析为 Data,那么只需像处理任何其他 Pojo 一样遍历生成的对象。如果您正在为此苦苦挣扎,您可能需要重新学习 Java 基础知识,尤其是有关循环、数组、集合和映射的主题。如果Data 本身就是问题,那么您应该展示该类,否则我们所能做的就是猜测。
  • @Thomas - 在之前的编辑中添加了类文件代码。
  • 您仍然没有共享Data 类,但您发布的代码有一个data.getElements()。假设返回Element(或类似的)的列表或数组,添加另一个循环来迭代元素和可能另一个用于步骤并将状态计数收集到Map<String, Integer>左右有什么问题?要更新地图中的值,请查看Map.compute()

标签: java json jackson


【解决方案1】:

点击此链接jsonschema2pojo 并粘贴您的 JSON 代码。键入文件和包的名称,然后选择单选按钮 JSONjackson 2.x。点击预览并复制模态窗口中显示的代码。

截图

【讨论】:

    【解决方案2】:

    所以你有一个 JSON 对象列表(在问题中这个列表只包含一个元素)并且你已经定义了 Data 可以映射这个单个 json 对象的类,对吧?

    在这种情况下,这个问题实际上是关于如何用杰克逊解析对象列表:

    这是一个答案:

    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    ...
    String str = "...";
    List<Data> dataList = objectMapper.readValue(str, new TypeReference<List<Data>>(){});
    

    【讨论】:

      【解决方案3】:

      这样做Data[] datas = mapper.readValue(new File("sample_json_file.json"), Data[].class); 然后循环。

      【讨论】:

        猜你喜欢
        • 2011-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-25
        • 2018-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多