Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaでJSONを逆シリアル化するときに生成されるエラーを処理するにはどうすればよいですか?


DeserializationProblemHandler クラスは、逆シリアル化プロセス中に回復可能な問題が発生したときに呼び出されるように登録できます。 handleUnknownProperty()を実装することで、JSONの逆シリアル化中に生成されたエラーを処理できます。 DeserializationProblemHandlerのメソッド クラス。

構文
public boolean handleUnknownProperty(DeserializationContext ctxt, JsonParser p, JsonDeserializer deserializer, Object beanOrClass, String propertyName) throws IOException
import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.*;
public class DeserializationErrorTest {
   public static void main(String[] args) throws JsonMappingException, JsonGenerationException, IOException {
      String jsonString = "{\"id\":\"101\", \"name\":\"Ravi Chandra\", \"address\":\"Pune\", \"salary\":\"40000\" }";
      ObjectMapper objectMapper = new ObjectMapper();
      DeserializationProblemHandler deserializationProblemHandler = new UnMarshallingErrorHandler();
      objectMapper.addHandler(deserializationProblemHandler);
      Customer customer = objectMapper.readValue(jsonString, Customer.class);
      System.out.println(customer);
   }
}
// UnMarshallingErrorHandler class
class UnMarshallingErrorHandler extends DeserializationProblemHandler {
   @Override
   public boolean handleUnknownProperty(DeserializationContext ctxt, JsonParser jp, JsonDeserializer deserializer, Object beanOrClass, String propertyName) throws IOException, JsonProcessingException {
      boolean result = false;
      super.handleUnknownProperty(ctxt, jp, deserializer, beanOrClass, propertyName);
      System.out.println("Property with name '" + propertyName + "' doesn't exist in Class of type '" + beanOrClass.getClass().getName() + "'");
      return true; // returns true to inform the deserialization process that we can handle the error and it can continue deserializing and returns false, if we want to stop the deserialization immediately.
   }
}
// Customer class
class Customer {
   private int id;
   private String name;
   private String address;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public String getAddress() {
      return address;
   }
   public void setAddress(String address) {
      this.address = address;
   }
   @Override
   public String toString() {
      return "Customer [id=" + id + ", name=" + name + ", address=" + address + "]";
   }
}

trueが返された場合の出力

Property with name 'salary' doesn't exist in Class of type 'Customer'
Customer [id=101, name=Ravi Chandra, address=Pune]
falseが返された場合の出力
Property with name 'salary' doesn't exist in Class of type 'Customer'
Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "salary" (class Customer), not marked as ignorable (3 known properties: "id", "address", "name"])
at [Source: (String)"{"id":"101", "name":"Ravi Chandra", "address":"Pune", "salary":"40000" }"; line: 1, column: 65] (through reference chain: Customer["salary"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:840)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1179)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1592) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1570) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:294)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3205)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3173)
at DeserializationErrorTest.main(DeserializationErrorTest.java:12)

  1. JavaでJacksonObjectModelを使用してJSONデータをマッピングするにはどうすればよいですか?

    ObjectMapper クラスは、Javaオブジェクト間で変換してJSON構造を照合するための機能を提供します。 オブジェクトモデルで表されるJSONデータのマッピングを実現できます ツリーのようなを使用して特定のJavaオブジェクトに JSONコンテンツ全体を読み取ってメモリに保存するデータ構造。最初のステップで、JSONデータを JSONNodeに読み込みます オブジェクト 次に、 treeToValue()を呼び出して、それを別のインスタンスにマップしました ObjectMapperのメソッド クラス。 構文 public <T> T treeToValue(TreeN

  2. JavaでJsonPointerインターフェースを使用してキーの値を取得するにはどうすればよいですか?

    JSONPointer 文字列構文を定義する標準です これは、JSONドキュメントの特定のキー値にアクセスするために使用できます。 JSONPointerのインスタンス 静的ファクトリメソッドcreatePointer()を呼び出すことで作成できます JSON クラス。 JSONPointerでは、 すべての文字列構文には、プレフィックスとして「/」が付いています。 。 getValue()を呼び出すことで、キーの値を取得できます。 JsonPointerのメソッド オブジェクト。 JSONファイル 例 import javax.json.*; import java.io