2016-12-06 3 views
0

は、私は次のようなJSON文字列があるとしましょう:jsonプロパティ接頭辞に基づいてjacksonで配列フィールドを作成するにはどうすればよいですか?

{ 
    "name": "Foo" 
    "pic1": "some pic 1", 
    "pic2": "some pic 2", 
    "pic3": "some pic 3", 
    ... 
    "picn": "some pic n" 
} 

私は、次のPOJOを作成する必要があります。この文字列から

class Foo { 
    String name; 
    String[] pics; 
} 

を。

トリックは何とかpic *をString []にマップする必要があります。

ジャクソンを使ってどうすればいいですか?

+0

@JonnyHenly、いいえ、あなたが提案してきた質問は、事前に定義された構造を持つオブジェクトのリストを構築することに関する。私はパターンに基づいて単一のオブジェクトで値のプロパティのリストを作成する必要があります。 – corvax

答えて

1

独自のカスタムシリアライザとデシリアライザを追加します。

@JsonSerialize(using = MySerializer.class) 
@JsonDeserialize(using = MyDeSerializer.class) 
public class Foo { 
    private String name; 
    private String[] pics; 

シリアライザ:

public class MySerializer extends JsonSerializer<Foo> { 

    @Override 
    public void serialize(Foo value, JsonGenerator jgen, SerializerProvider serializers) throws IOException { 
     int i = 1; 
     String fieldName = "pics"; 
     jgen.writeStartObject(); 
     jgen.writeStringField("name", value.getName()); 
     for (String stringValue : value.getPics()) { 
      jgen.writeStringField(fieldName + i, stringValue); 
      i++; 
     } 
     jgen.writeEndObject(); 

    } 

} 

デシリアライザ:

public class MyDeSerializer extends JsonDeserializer<Foo> { 

    @Override 
    public Foo deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { 
     ObjectCodec objectCodec = jp.getCodec(); 
     Foo foo = new Foo(); 
     JsonNode node = objectCodec.readTree(jp); 

     Iterator<Entry<String, JsonNode>> fields = node.fields(); 
     String[] pics = new String[node.size() - 1]; 

     int i = 0; 
     while (fields.hasNext()) { 
      Entry<String, JsonNode> next = fields.next(); 
      if (next.getKey().equalsIgnoreCase("name")) 
       foo.setName(node.get("name").asText()); 
      else { 
       pics[i] = node.get(next.getKey()).asText(); 
       i++; 
      } 
     } 
     foo.setPics(pics); 
     return foo; 
    } 
} 
関連する問題