2017-11-28 65 views
0

外部サービスは、プレーン/プリミティブ要素を持つJSON配列を提供しています(フィールド名がなく、ネストしたJSONオブジェクトはありません)。私はジャクソンを使用して、次のJavaクラスのインスタンスにこれを変換したいジャクソン、プレーンなJSON配列を単一のJavaオブジェクトにデシリアライズ

["Foo", "Bar", 30] 

:たとえば

class Person { 
    private String firstName; 
    private String lastName; 
    private int age; 

    Person(String firstName, String lastName, int age) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.age = age; 
    } 
} 

(必要であれば、このクラスは適合させることができる。)

質問:このJSONをJavaに逆シリアル化することは可能ですか?

Person p = new ObjectMapper().readValue(json, Person.class); 

これは、このPersonクラスのカスタムジャクソンデシリアライザを記述することによってのみ可能ですか?

私は次のことをしようとしましたが、それはうまくいきませんでした:

import com.fasterxml.jackson.annotation.JsonCreator; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.databind.ObjectMapper; 

import java.io.IOException; 

public class Person { 
    private String firstName; 
    private String lastName; 
    private int age; 

    @JsonCreator 
    public Person(
      @JsonProperty(index = 0) String firstName, 
      @JsonProperty(index = 1) String lastName, 
      @JsonProperty(index = 2) int age) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.age = age; 
    } 

    public static void main(String[] args) throws IOException { 
     String json = "[\"Foo\", \"Bar\", 30]"; 
     Person person = new ObjectMapper().readValue(json, Person.class); 
     System.out.println(person); 
    } 
} 

結果:Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Argument #0 of constructor [constructor for Person, annotations: {interface [email protected]son.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator at [Source: (String)"["Foo", "Bar", 30]"; line: 1, column: 1]

答えて

3

あなただけ@JsonFormat(shape = JsonFormat.Shape.ARRAY)

@JsonFormat(shape = JsonFormat.Shape.ARRAY) 
public static class Person { 
    @JsonProperty 
    private String firstName; 
    @JsonProperty 
    private String lastName; 
    @JsonProperty 
    private int age; 
} 

と使用を使用し、@JsonCreatorを必要としません@JsonPropertyOrder({"firstName", "lastName", "age" })あなたのBeanにいくつかの代替フィールド宣言の順序を保持する必要がある場合。

関連する問題