2016-08-19 31 views
0

ジャクソンを使用してJavaオブジェクトをJSON形式に変換したいと考えています。私はかなり、以下の構造ジャックソンでJavaオブジェクトをJSONツリー形式に変換する方法

public Class Event 
{ 
    String type; 
    String timestamp; 
    String hostname; 
    String service; 
    Payload payload; 
} 

私もゲッターとセッター上記のフィールドのためのペイロードクラスのゲッター/セッターを持っているに見えるクラスを持っています。ここで

はJSON形式で、私は

{ 
    "type":"end", 
    "time":"2016-08-01 11:11:11:111", 
    "origin":{ 
     "hostname":"<hostname>", 
     "service":"<service>" 
    }, 
    "version":"1.0" 
    "data":{ .... } 
} 

をしたい私は、「データ」で全体のペイロード・オブジェクトを配置する方法がわからない、上記の形式を取得するにはジャクソンの方法を見つけるように見えることはできませんノードとホスト名、サービスを "起点"ノードに入れる方法。

+1

こんにちは、あなたのJSONのプロパティ名は、お使いのJavaのプロパティ名と一致しない - また、あなたが追加する必要があります(わざと?) (例えば、orign => payload?) – pandaadb

+0

こんにちは、原点はペイロードではなく、ホスト名とサービスフィールドをラップするヘッダーの一部です。「データ」は次のようになっています。ペイロードをラップする – Nitesh

答えて

0

あなたの質問から、これを解決する方法を示すべきであるアプローチです。 1クラスだけを投稿しているので、ペイロードを地図に変更しています。他のクラスと同様に動作します。

は、この例を考えてみましょう:

public class JacksonTest { 

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

     Event e = new Event(); 
     e.type="end"; 
     e.service="<service>"; 
     e.hostname = "<hostname>"; 
     e.timestamp = LocalDateTime.now().toString(); 
     Map<String,String> payload = new HashMap<>(); 
     payload.put("param1", "xyz"); 
     e.payload = payload; 

     String writeValueAsString = new ObjectMapper().writeValueAsString(e); 
     System.out.println(writeValueAsString); 
    } 



    public static class Event { 
     @JsonProperty 
     String type; 
     @JsonProperty("time") 
     String timestamp; 
     @JsonIgnore 
     String hostname; 
     @JsonIgnore 
     String service; 
     @JsonProperty("data") 
     Map<String, String> payload; 

     @JsonProperty("origin") 
     Map<String,String> getOrigin() { 
      Map<String,String> tmp = new HashMap<>(); 
      tmp.put("hostname", hostname); 
      tmp.put("service", service); 
      return tmp; 
     } 

     @JsonProperty("version") 
     private String getVersion() { 
      return "1.0"; 
     } 
    } 


} 

私は私が欲しい、必要なプロパティと、彼らが持つべき名前でEventクラスに注釈を付けます。ホスト名とサービスをネストされた設定にして、新しいオブジェクトを作成しないようにしたいので(新しいオブジェクトは直列化されたほうが簡単です)、それらを無視してゲッターを使用して必要な構造を作成しますマップとして。

出力は次のようになります。

{ 
"type":"end", 
"time":"2016-08-19T16:45:18.072", 
"data":{"param1":"xyz"}, 
"origin":{ 
    "hostname":"<hostname>", 
    "service":"<service>" 
}, 
"version":"1.0" 
} 

Regads、

アルトゥル

関連する問題