java—有没有一种方法可以利用jackson objectmapper从json中逐个读取对象

jutyujz0  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(421)

我想知道是否有可能利用 ObjectMapperJackson 逐条阅读事件。
我有一个很大的json文件,其中包含许多需要转换为xml的事件。我不想将完整的json事件加载到我的内存中,而是希望逐个处理事件。因此,我正在利用 Java Jackson 这个库可以遍历json文件,每次获得一个json事件,然后我可以将其转换为xml。这样,一次只能将一个事件加载到内存中。
我知道我可以使用 JsonParser 从jackson开始,它将一个接一个地遍历json文件,但是这样,我需要处理很多事情。
我有从xsd创建的java类(使用 JAXB2 )所以我想用 ObjectMapper 上课地点 Jackson 它可以直接将每个事件Map到相应的java类,稍后我可以使用 Marshalling 方法。
我不明白如何使用 ObjectMapper 并将其分配给相应的java类。
下面是我的json文件的简单版本:(这是一个示例json我的原始json非常复杂)

{
   "@context":"https://context.org/context.jsonld",
   "isA":"SchoolManagement",
   "format":"application/ld+json",
   "schemaVersion":"2.0",
   "creationDate":"2021-04-21T10:10:09+00:00",
   "body":{
      "members":[
         {
            "isA":"student",
            "name":"ABCS",
            "class":10,
            "coaching":[
              "XSJSJ",
              "IIIRIRI"
            ],
            "dob":"1995-04-21T10:10:09+00:00"
         },
         {
            "isA":"teacher",
            "name":"ABCS",
            "department":"computer science",
            "school":{
              "name":"ABCD School"
            },
            "dob":"1995-04-21T10:10:09+00:00"
         },
         {
            "isA":"boardMember",
            "name":"ABCS",
            "board":"schoolboard",
            "dob":"1995-04-21T10:10:09+00:00"
         }
      ]
   }
}

我想逐一阅读“members”数组中的事件,并检查它是否是“student”、“teacher”等,然后将其分配给相应的类。

public class Main {

  public static void main(String[] args) throws JsonParseException,
  JsonMappingException,
  IOException,
  JAXBException {

    final ObjectMapper objectMapper = new ObjectMapper();

    // Accept the Null values for some fields
    objectMapper.setSerializationInclusion(Include.NON_NULL);

    // If any unknown properties found then do not fail
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    //Here I want to read the element within an array 
    Student event = objectMapper.readValue(Main.class.getResourceAsStream("/events.json"), Student.class);
    System.out.println(event);

  }

}
rggaifut

rggaifut1#

基本上,使用jackson2解析json有三种不同难度的方法。
objectmapper(mapper.readvalue()):要编写的代码更少-应该用于简单的数据绑定,
objectmapper(树模型):中等代码-应用于复杂的json
jsonparser(流模型):当需要最终性能时,应该使用更多的代码。
您正在寻找树模型。它结合了 JSONParser 易于使用 ObjectMapper . 试试这个 ObjectMapper 就像下面一样

//create Object Node using Tree model
ObjectNode event = objectMapper.readTree("/events.json");

//Now access the Json One by One as you like
JsonNode memberNode = json.get("body").get("Members");

有一个很好的关于树模型的教程
阅读更多:jackson2官方文档

cunj1qz1

cunj1qz12#

我将告诉你如何读取一个json文件并获取每个键的值,如何将其放入xml文件将在你手中。
1为json文件创建所需数量的pojo(您可以在此处自动生成:https://www.jsonschema2pojo.org/)
2代码:

ObjectMapper objectMapper = new ObjectMapper();
            School school = new School();
            File file = new File("school.json");

            //With this you map the JSON file and get the data
            try {
                school = objectMapper.readValue(file, School.class);

                String JSONOutputCustomer = objectMapper.writeValueAsString(school.getBody());
                System.out.println(JSONOutputCustomer);

            } catch (IOException e) {
                e.printStackTrace();
            }
            /*With this you list the info inside of the key Body.
I just did it with body, but you can do it with any key you want, as for example Member, you can list only the information of just one member insted all of them doing the same as the example below*/

            List<Body> bodyList = new ArrayList<Body>();

            for(Body values : bodyList) {
                System.out.println(values.getMembers());
            }

现在你知道如何得到每一个关键与他的价值。
注意:我不放pojo类,因为它是4,它的代码太多,你可以从我上面留下的链接得到
注2:别怪我的拼字法,我还在学英语
例2:

ObjectMapper objectMapper = new ObjectMapper();
Member member = new Member();
        File file = new File("school.json");

try {
            member = objectMapper.readValue(file, Member.class);

            String JSONOutputCustomer = objectMapper.writeValueAsString(member);
            System.out.println(JSONOutputCustomer);
        } catch (IOException e) {
            e.printStackTrace();
        }

相关问题