2016-04-01 14 views
1

JavaオブジェクトをJSON文字列に変換したいと思います。特定の構文でJavaオブジェクトをJSONに変換する

public class User{ 
    private Long id; 
    private String firstName; 
} 

とJSONは次のようになります:

{ 
    "inputFields":[ 
     { 
      "name":"id", 
      "value":"123" 
     }, 
     { 
      "name":"firstName", 
      "value":"George" 
     } 
    ] 
} 

はジャクソンを使用しようとしましたが、それは直列化のような種類を提供していないように見えます。オブジェクトはこのようになりますと言うことができます

+0

ますクラス 'User'オブジェクトの配列を' Serialize'するためにカスタムシリアライザが必要です。 –

+0

これは、あなたが何をする必要があるかです:http://www.baeldung.com/jackson-custom-serialization – dabadaba

+1

なぜあなたは、このような厄介なJSON構造が必要なのでしょうか? '' id '': "123"、 "name": "George" 'を持つ方が良いでしょうか? – BadCash

答えて

2

ジャクソンは、あなたが出力を生成して制御することができるカスタム・シリアライザを使用することができます。次 は、これを行うためのステップです:

は、簡単なテスト

public static void main(String[] args) throws JsonProcessingException { 
    User user = new User(1L, "Mike"); 
    ObjectMapper om = new ObjectMapper(); 
    om.writeValueAsString(user); 
    System.out.println(om.writeValueAsString(user)); 
} 

serialzer

static class CustomSerializer extends JsonSerializer{ 

    @Override 
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider serializers) throws IOException, JsonProcessingException { 
     jgen.writeStartObject(); 
     jgen.writeArrayFieldStart("inputFields"); 

     Field[] fields = value.getClass().getDeclaredFields(); 

     for (Field field : fields) { 
      try { 
       field.setAccessible(true); 
       jgen.writeStartObject(); 
       jgen.writeObjectField("name", field.getName()); 
       jgen.writeObjectField("value", field.get(value)); 
       jgen.writeEndObject(); 
      } catch (IllegalArgumentException | IllegalAccessException e) { 
       e.printStackTrace(); 
      } 

     } 

     jgen.writeEndArray(); 
     jgen.writeEndObject(); 
    } 
} 

を宣言カスタム・シリアライザ

@JsonSerialize(using = CustomSerializer.class) 
static class User{ 
    public Long id; 
    public String firstName; 

    public User(Long id, String firstName) { 
     this.id = id; 
     this.firstName = firstName; 
    } 

    public Long getId() { 
     return id; 
    } 

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

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
} 

を使用するようにPOJOに注釈を付けると出力は

になります210
{"inputFields":[{"name":"id","value":1},{"name":"firstName","value":"Mike"}]} 
+0

あなたはどのバージョンのjacksonを使用していますか?この例では –

+0

はjackson 2.6.1 – dumitru

+0

を使用して 'field.setAccessible(true);'をループに追加しました。この回答を最も「オン・ポイント」かつエレガントなものとして受け入れます。 –

0

InputFieldsクラスを作成し、JSONに変換する前に、それにUserオブジェクトデータを移動させます。

編集:InputFieldsクラスは明らかに必要なJSONの結果と同じ構造を持っているでしょう。

+1

フィールドをInputFieldsクラス内のCollectionにします。または、カスタムコンバータを作成します。 – dambros

+0

@stepanian実際には、inputFieldsは大きな問題ではない、問題は名前と値のペアの構造です –

+0

私はそれを理解しています。 InputFieldsクラスはその構造を持ちます。 – stepanian

0

stepanianの答えのちょうど一例が、私はCustomSerializerを実装するドミトルの方法を好みます。

  1. のInputFieldクラスを作成

    public class InputField { 
    
        private String name; 
        private String value; 
    
        public String getValue() { 
         return value; 
        } 
    
        public void setValue(String value) { 
         this.value = value; 
        } 
    
        public String getName() { 
         return name; 
        } 
    
        public void setName(String name) { 
         this.name = name; 
        } 
    
    } 
    
  2. パースユーザー

    public static List<InputField> parseInputFields(Object model) { 
        List<InputField> inputFields = new ArrayList<InputField>(); 
    
        Field[] field = model.getClass().getDeclaredFields(); 
        try { 
         for (int j = 0; j < field.length; j++) { 
    
          InputField inputField = new InputField(); 
    
          inputField.setName(field[j].getName()); 
          inputField.setValue(String.valueOf(field[j].get(model)); 
    
          inputFields.add(inputField); 
         } 
        } catch (NoSuchMethodException e) { 
         e.printStackTrace(); 
        } catch (SecurityException e) { 
         e.printStackTrace(); 
        } catch (IllegalAccessException e) { 
         e.printStackTrace(); 
        } catch (IllegalArgumentException e) { 
         e.printStackTrace(); 
        } catch (InvocationTargetException e) { 
         e.printStackTrace(); 
        } 
    
        return inputFields; 
    } 
    
  3. テスト

    public static void main(String[] args) throws JsonProcessingException { 
        User user = new User(1L, "Mike"); 
    
        Map<String, Object> tmpMap=new HashedMap(); 
        tmpMap.put("inputFields", parseInputFields(user)); 
    
        ObjectMapper om = new ObjectMapper(); 
        System.out.println(om.writeValueAsString(tmpMap)); 
    } 
    
関連する問題