1

これを行う方法があったかどうか疑問に思っています-私はクラスを持っています

class MyClass {
    private String name;
    private String address;
    private String number;
}

Jackson を使用して Json にシリアル化すると、文字列変数をまとめてラップしたいので、次のようになります。

{
    "Strings": {
         "name" : "value",
         "address" : "value"
    }
 }

これらの変数を MyClass 内の List または Map クラスにラップせずに...これは可能ですか?

4

5 に答える 5

2

POJO クラスに「Strings」、「Intigers」などの getter を追加することもできます。これらMapのメソッドは、結果として を返す必要があります。以下のコードを検討してください。

import java.util.LinkedHashMap;
import java.util.Map;

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

public class JacksonProgram {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        MyClass myClass = new MyClass();
        myClass.setAddress("New York, Golden St. 1");
        myClass.setName("James Java");
        myClass.setNumber("444");

        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(myClass));
    }
}

class MyClass {

    private String name;
    private String address;
    private String number;

    @JsonIgnore
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @JsonIgnore
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @JsonIgnore
    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    @JsonProperty(value = "Strings")
    public Map<String, String> getStrings() {
        Map<String, String> map = new LinkedHashMap<String, String>();
        map.put("name", getName());
        map.put("address", getAddress());
        map.put("number", getNumber());
        return map;
    }
}

結果:

{
  "Strings" : {
    "name" : "James Java",
    "address" : "New York, Golden St. 1",
    "number" : "444"
  }
}

これはおそらく、使用できる最も洗練されたソリューションではありませんが、単純です。

于 2013-07-11T23:16:19.597 に答える
1

Jackson は、クラス構造を利用して json 構造を決定します。クラス属性を別の属性でラップする必要がある場合は、ラップを検討する必要があります。コレクションが必要ない場合は、コレクションを作成する必要はありません。名前とアドレスを別のクラスに入れ、ラッパーの名前を希望するとおりにそのクラスに名前を付けるだけです。次に、ラッパー クラスのインスタンスを MyClass に追加します。

于 2013-07-10T09:48:30.877 に答える
0

JsonSerializerはSpringでこれを行っていましたが、非常に簡単です。

拡張するクラスを作成しますJsonSerializer

このように:

 public class ServerResposeSerializer extends JsonSerializer<ServerResponse> {
@Override
public void serialize(ServerResponse objectWrapper, JsonGenerator generator,
        SerializerProvider provider) throws IOException,
        JsonProcessingException {
    generator.writeStartObject();
    generator.writeNumberField("http_status", objectWrapper.getStatus().value());
    generator.writeStringField("message",objectWrapper.getMessage());
    generator.writeArrayFieldStart("objects");      
    List<?> objects = objectWrapper.getObjects();       
    for (Object object: objects)
    {
        generator.writeObject(object);
    }       
    generator.writeEndArray();
    generator.writeEndObject();
}

}

で注釈ServerResponseを付ける

@JsonSerialize (using = ServerResposeSerializer.class)

あらゆる種類の JSON 文字列を生成するクラスをフォーマットできるようになりました

于 2013-07-11T23:25:23.370 に答える
0

少し古い質問ですが、同じ問題の解決策を探しているときに、この回答に出会いました。

基本的に、関数を使用してObjectWriterfromを作成し、マッピング用にを設定します。ObjectMapperwriter()rootName

MyClass myclass = new MyClass()
myclass.setName("a");
myclass.setAddress("b");
ObjectMapper mapper = new ObjectMapper();
ObjectWriter writer = mapper.writer().withRootName("Strings");
String json = writer.writeValueAsString(myclass);

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

{
   "Strings": {
     "name" : "a",
     "address" : "b"
    }  
}

ノート:

ObjectMapper はスレッドセーフであり、可能な場合は再利用する必要があるとドキュメントに記載されています。

于 2015-09-10T11:38:11.817 に答える