如何在 Java 中忽略解析 JSON 时未知的属性?


在 Java 中处理 JSON 数据时,开发者可能会遇到在相应的 Java 类中未定义的未知属性或字段。这些未识别的元素可能会在解析过程中造成问题,导致异常或数据丢失。为了解决这个问题,程序员可以加入一种机制来忽略解析 JSON 时此类未知属性。

正确配置 JSON 解析器可以防止意外属性破坏应用程序的功能。通过跳过未识别的属性,只解析与定义结构匹配的属性,可以更健壮和灵活地解析 JSON 数据。这确保不会忽略关键信息,同时忽略不需要的或无效的数据。

JSON

Java 使用 JSON (JavaScript 对象表示法) 作为轻量级且广泛使用的数据交换格式来传输和存储结构化数据。其简单易读的格式允许表示对象、数组、字符串、数字、布尔值和空值。JSON 的构成包括使用字符串形式的键的键值对,简化了其处理负载。

改述Java 中的 JSON 格式通常表示为字符串,并使用解析和序列化库在 Java 对象之间进行转换。这些 API 通过允许将 JSON 字符串解析为 Java 对象,反之亦然,从而实现基于 JSON 的系统和 Java 应用程序之间的集成。这种无缝通信促进了不同系统之间的数据轻松交换。

方法

在 Java 中忽略解析 JSON 时未知属性的方法有很多。以下是一些常用方法

  • 使用 ObjectMapper 的 Jackson 库

  • 使用 GsonBuilder 的 Gson 库

  • JSON-B (Java API for JSON Binding)

  • 手动解析

使用 ObjectMapper 的 Jackson 库

此方法涉及配置 Jackson 库提供的类 ObjectMapper,即将 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 特性设置为 false。这允许 ObjectMapper 在解析 JSON 时忽略未知属性,防止抛出异常。

算法

  • 创建 ObjectMapper 实例。

  • 配置 ObjectMapper 将 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 特性设置为 false。

  • 使用 ObjectMapper 将 JSON 数据解析为所需的 Java 对象。

示例

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonExample {
   public static void main(String[] args) throws Exception {
      String jsonString = "{"name": "John", "age": 25, "unknownProperty": "Value"}";

      ObjectMapper objectMapper = new ObjectMapper();
 
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

      Person person = objectMapper.readValue(jsonString, Person.class);
      System.out.println(person);
   }
}

class Person {
   private String name;
   private int age;

   // Getters and setters

   @Override
   public String toString() {
      return "Person{" +
            "name='" + name + ''' +
            ", age=" + age +
            '}';
   }
}

输出

Person{name='John', age=25}

使用 GsonBuilder 的 Gson 库

在此方法中使用 Gson 库,需要使用 GsonBuilder 类创建一个 Gson 实例。这可以通过调用 setIgnoreUnknownProperties() 方法并使用 true 作为参数来实现。这样做指示 Gson 在 JSON 解析期间忽略未知属性,确保它们不被视为错误。

算法

  • 创建一个 GsonBuilder 实例。

  • 在 GsonBuilder 实例上调用 setIgnoreUnknownProperties(true) 方法。

  • 使用 GsonBuilder 构建一个 Gson 对象。

  • 使用 Gson 对象将 JSON 数据解析为所需的 Java 对象。

示例

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class GsonExample {
   public static void main(String[] args) {
      String jsonString = "{"name": "John", "age": 25, "unknownProperty": "Value"}";

      Gson gson = new GsonBuilder()
            .setIgnoreUnknownProperties(true)
            .create();

      Person person = gson.fromJson(jsonString, Person.class);
      System.out.println(person);
   }
}

class Person {
   private String name;
   private int age;

   // Getters and setters

   @Override
   public String toString() {
      return "Person{" +
            "name='" + name + ''' +
            ", age=" + age +
            '}';
   }
}

输出

Person{name='John', age=25}

JSON-B (Java API for JSON Binding)

要使用 JSON-B 忽略未知属性,表示 JSON 结构的 Java 类需要在应该忽略的字段或属性上使用 @JsonbTransient 注解。此注解通知 JSON-B 库在 JSON 解析过程中跳过这些属性。

算法

  • 在表示 JSON 结构的 Java 类上使用 @JsonbTransient 注解要忽略的字段或属性。

  • 使用 JSON-B 实现将 JSON 数据解析为所需的 Java 对象。

示例

import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;

public class JsonBExample {
   public static void main(String[] args) {
      String jsonString = "{"name": "John", "age": 25, "unknownProperty": "Value"}";

      Jsonb jsonb = JsonbBuilder.create();

      Person person = jsonb.fromJson(jsonString, Person.class);
      System.out.println(person);
   }
}

class Person {
   private String name;
   private int age;

   // Getters and setters

   @Override
   public String toString() {
      return "Person{" +
            "name='" + name + ''' +
            ", age=" + age +
            '}';
   }
}

输出

Person{name='John', age=25}

手动解析

要使用像 org.json 或 json-simple 这样的库解析 JSON 数据,开发者需要手动迭代 JSON 对象的键和值。通过选择性地处理已识别的属性并忽略未知属性,开发者可以自定义他们需要的解析行为。

算法

  • 使用像 org.json 或 json-simple 这样的 JSON 库将 JSON 数据解析为 JSON 对象。

  • 迭代 JSON 对象的键和值。

  • 在迭代期间处理已识别的属性并忽略任何未识别或未知的属性。

示例

import org.json.JSONObject;

public class ManualParsingExample {
   public static void main(String[] args) {
      String jsonString = "{"name": "John", "age": 25, "unknownProperty": "Value"}";

      JSONObject jsonObject = new JSONObject(jsonString);

      String name = jsonObject.optString("name");
      int age = jsonObject.optInt("age");

      Person person = new Person();
      person.setName(name);
      person.setAge(age);

      System.out.println(person);
   }
}

class Person {
   private String name;
   private int age;

   // Getters and setters

   @Override
   public String toString() {
      return "Person{" +
            "name='" + name + ''' +
            ", age=" + age +
            '}';
   }
}

输出

Person{name='John', age=25}

结论

在本教程中,在 Java 中解析 JSON 时,正确处理未知属性非常重要,以确保数据处理的健壮性和灵活性。通过使用诸如使用 Jackson 配置 ObjectMapper、使用 GsonBuilder 使用 Gson、利用 JSON-B 注解或手动解析 JSON 数据等方法,开发者可以有效地忽略未知属性,并在 Java 中解析 JSON 时减少潜在问题。

更新于:2023年7月25日

3K+ 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告