2017-09-24 8 views
1

私たちはコードでJackson JSONマッパーを使用していくつかの設定オブジェクトを直列化解除しています。特定のフィールドは、この動作をサポートするために、ジャクソンの唯一の機能は存在しないか、または空のJackson Mapper - null値または空の値で失敗する方法

されたときにジャクソンは、デシリアライズに失敗するために私たちは希望のプリミティブのためである:

final DeserializationConfig.Feature failOnPremitives = DeserializationConfig.Feature.FAIL_ON_NULL_FOR_PRIMITIVES; 

事が問題となっている分野であります主に文字列

は、すべてのヘルプは非常に

答えて

0

と呼ばれるオプションがあります:FAIL_ON_NULL_FOR_CREATOR_PARAMETERS

だから私はそれがでアクセス可能になりますと仮定しますDeserializationConfig.Feature.FAIL_ON_NULL_FOR_CREATOR_PARAMETERS;

またはyml中:

jackson: 
    serialization: 
     indent-output: false 
    deserialization: 
     fail-on-unknown-properties: true 
     fail-on-missing-creator-properties: true 
     fail-on-null-creator-properties: true 

これは真剣にすべての種類、文字列、int型などを倍増..

+0

クリエイターメソッドのパラメーターにバインドされたプロパティに対してのみ機能しませんか?私はコンストラクタまたは静的ファクトリメソッドを意味します。 –

+0

@CassioMazzochiMolin私はそう思いますが、それは本当に問題ではありません。 –

0

を高く評価されているあなたはBean Validationを検討したことがありますか?

ジャクソンはJSON解析に焦点を当てていますが、Bean検証はすべてあなたのBeanの宣言と検証を実行することです。

@NotNullまたは@NotBlankからHibernate Validator、Bean Validationリファレンス実装を使用できます。


また、JSON Schemaを使用することもできます。

0

オブジェクト固有のカスタムデシリアライザを作成する必要があります。

import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.core.ObjectCodec; 
import com.fasterxml.jackson.core.Version; 
import com.fasterxml.jackson.databind.DeserializationContext; 
import com.fasterxml.jackson.databind.JsonNode; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.deser.std.StdDeserializer; 
import com.fasterxml.jackson.databind.module.SimpleModule; 

import java.io.IOException; 

class JacksonDeserializerTest { 

    public static void main(String[] args) throws Exception { 
     ObjectMapper mapper = new ObjectMapper(); 
     SimpleModule module = new SimpleModule("CustomPersonDeserializer", new Version(1, 0, 0, null, null, null)); 
     module.addDeserializer(Person.class, new CustomPersonDeserializer()); 
     mapper.registerModule(module); 

     String jsonString = "{ \"id\": 1, \"name\": \"User 1 \"}"; 
     Person user = mapper.readValue(jsonString, Person.class); 
     System.out.println("User: " + user.toString()); 

     jsonString = "{ \"id\": 1}"; 
     user = mapper.readValue(jsonString, Person.class); 
    } 

    static class CustomPersonDeserializer extends StdDeserializer<Person> { 

     private static final long serialVersionUID = -4100181951833318756L; 

     public CustomPersonDeserializer() { 
      this(null); 
     } 

     public CustomPersonDeserializer(Class<?> vc) { 
      super(vc); 
     } 

     @Override 
     public Person deserialize(JsonParser parser, DeserializationContext deserializer) throws IOException, JsonProcessingException { 
      Person person = new Person(); 
      ObjectCodec codec = parser.getCodec(); 
      JsonNode node = codec.readTree(parser); 

      JsonNode idNode = node.get("id"); 
      int id = idNode.asInt(); 
      person.setId(id); 

      JsonNode nameNode = node.get("name"); 
      if(nameNode == null){ 
       throw new IOException("name must be provided"); 
      } 

      String name = nameNode.asText(); 
      if (name.trim().length() < 1){ 
       throw new IOException("name can not be empty"); 
      } 

      person.setName(name); 
      return person; 
     } 
    } 

    static class Person { 
     private int id; 
     private String name; 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     public int getId() { 
      return id; 
     } 

     public void setId(int id) { 
      this.id = id; 
     } 

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

上で動作しますか? !それぞれのclass_の_customデシリアライザを作成しますか?数十、数百のクラスがあればどうなりますか?あなたはジャクソンの能力の何%の利点も取らないでしょう。これは_realプロジェクトの_受け入れがたい解決策ではありません。 –

+0

@CassioMazzochiMolin私の答えを見てください。 –

関連する問題