2017-11-16 17 views
-2

別のクラスにJSONの一部のフィールドをデシリアライズ:私は以下の形式のJSON持っ

{ 
    "id": 0, 
    "alternateId": 0, 
    "familyName": "", 
    "givenName": "", 
    "firstName":"", 
    "lastName": "", 
    "middleName": "", 
    "suffix": "",  
    "motherName": "", 
    "datOfBirth": "", 
    "sex": "", 
    "alias": [ 
     { 
     "firstName": "", 
     "lastName": "", 
     "middleName": "", 
     "suffix": "", 
     } 
    ] 
} 

はあなたが観察することができたように、四つのフィールドfirstNamealiasフィールドに存在しているlastNamemiddleName、およびsuffix親クラスのフィールドとしてその上にも存在します。

public class Person 
{ 
    private int  id; 
    private int  alternateId; 
    private String familyName; 
    private String givenName; 
    private String firstName; 
    private String lastName; 
    private String middleName; 
    private String suffix; 
    private String motherName; 
    private Date datOfBirth; 
    private String sex; 
    private Set<Alias> alias; 
} 

public class Alias 
{ 
    private String firstName; 
    private String lastName; 
    private String middleName; 
    private String suffix; 
} 

ジャクソンマッパーとの作業の良い:

現在、私は次のクラスがあります。しかし、私の質問は、Personクラスにあるフィールドは、新しいフィールドprimaryAliasに組み合わせることが可能であり、クラスはに減少させること:現在のJSONを変更することなく、

public class Person 
{ 
    private int  id; 
    private int  alternateId; 
    private String familyName; 
    private String givenName; 
    private Alias primaryAlias; 
    private String motherName; 
    private Date datOfBirth; 
    private String sex; 
    private Set<Alias> alias; 
} 

。何かがfirstNameは、lastNameは、middleNameは、とJSONのsuffixは、新しい変数primaryAliasにロードするためのフィールドをマッピングしますジャクソンのデシリアライザを書くために行うことができますか?

そうする完全なコードは必要ないが、十分でしょうに何をすべきかのヒント。私は検索しようとしましたが、おそらく私はこの問題を記述するのに完璧な用語が不足しています。

たぶん私は、画像をよりよく説明することができます。現在起こっていただきました!これは次のとおりです。

enter image description here

をそして、これは私が欲しいものです:

あなたの救助にenter image description here

+0

私は応答を削除しました。しかし、あなたのJSONでは、 'エイリアス'はリストなので、自動的にはできません。おそらくあなたはJSOnを使ってオブジェクトを手動で作成することができます。 – canillas

+0

@canillasはい。私が知っています。私は、おそらくアノテーションとカスタムデシリアライザによる自動ジャックソンソリューションを考えていました。 –

+0

代わりにorg.jsonを使用すると、それを実行できます。このライブラリでは、クラスのgetterからJSON表現が作成されます。したがって、必要な文字列を返すメソッド 'getPrimaryAlias()'を作成すると、そのメソッドは機能します。次に例を示します:https://stackoverflow.com/a/46826568/6370796 – Asew

答えて

1

は、なるように、クラスを作成する前に制御することができます@JsonCreator来るあなたプロパティを自分で埋めることができます:)

ここに私の迅速な作業は(私はあなたの大きなJSONの限定されたプロパティを使用している)です。同様に、私のtoStringメソッドは、プロパティがロードされたことを反映するだけです。必要なら意味のあるtoStringを持つことができます。

import com.fasterxml.jackson.annotation.JsonCreator; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.core.type.TypeReference; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import java.util.Map; 
import java.util.Set; 

public class JacksonTest { 

    final static ObjectMapper mapper = new ObjectMapper(); 

    public static void main(String[] args) throws Exception { 

     final String jsonInString = "{\n" 
       + " \"id\": 0,\n" 
       + " \"familyName\": \"someFN\",\n" 
       + " \"givenName\": \"someGivenName\",\n" 
       + " \"firstName\":\"firstNameInperson\",\n" 
       + " \"lastName\": \"\",\n" 
       + " \"middleName\": \"\",\n" 
       + " \"suffix\": \"\", \n" 
       + " \"motherName\": \"\",\n" 
       + " \"alias\": [\n" 
       + "  {\n" 
       + "  \"firstName\": \"firstNameInAlias\",\n" 
       + "  \"lastName\": \"\",\n" 
       + "  \"middleName\": \"\",\n" 
       + "  \"suffix\": \"\"\n" 
       + "  }\n" 
       + " ]\n" 
       + "}"; 
     //System.out.println(jsonInString); 

     Person person = mapper.readValue(jsonInString, Person.class); 
     System.out.println(person); 
     // System.out.println(newFoo.getSomething()); 
    } 
} 

class Person { 

    @JsonProperty 
    private int id; 

    @JsonProperty 
    private String familyName; 

    Alias alias; 

    @JsonProperty 
    private String motherName; 
    @JsonProperty 
    private Set<Alias> aliases; 

    @JsonCreator 
    public Person(final Map<String, Object> properties) { 
     System.out.println("printing in constructor.." + properties); 
     id = (Integer) properties.get("id"); 
     familyName = (String) properties.get("familyName"); 
     Alias al = new Alias(); 
     al.firstName = (String) properties.get("firstName"); 
     al.lastName = (String) properties.get("lastName"); 
     al.middleName = (String) properties.get("middleName"); 
     al.suffix = (String) properties.get("suffix"); 
     this.alias = al; 
     TypeReference aliasesType = new TypeReference<Set<Alias>>() { 
     }; 
     try { 
      aliases = JacksonTest.mapper.readValue(JacksonTest.mapper.writeValueAsString(properties.get("alias")), aliasesType); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public String toString() { 
     return "Person: familyName:" + familyName + ", Alias: " + alias + " Aliases:" + aliases; 
    } 

} 

class Alias { 

    @JsonProperty 
    String firstName; 

    @JsonProperty 
    String lastName; 

    @JsonProperty 
    String middleName; 

    @JsonProperty 
    String suffix; 

    public String toString() { 
     return "Alias : firstName::" + firstName; 
    } 
} 
+0

ありがとうございます。これは完璧です。 –