1

私はこれを試しました:

import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiResponse;
import com.wordnik.swagger.annotations.ApiResponses;
import org.apache.commons.lang.Validate;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.print.attribute.standard.Media;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
import java.io.Serializable;

public static class MyJSON implements Serializable {
    private final String name = "myname";

    // **Why don't I get this field serialized in the response?**
    private final JSONObject jsonObject = new JSONObject();

    public MyJSON() {
        try {
            jsonObject.put("mykey", "myvalue");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public String getName() { return name; }
    public JSONObject getJsonObject() { return jsonObject; }

}

@GET
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Get all entities", notes = "get all entities", response = Response.class)
@ApiResponses(value = { @ApiResponse(code = 200, message = "OK status"),

public Response getList() {

    return Response.ok(new MyJSON(), MediaType.APPLICATION_JSON).build();
}

私が得る応答:

{
  "name": "myname"
}

nameご覧のとおり、フィールドMyJSONなしのフィールドのみを取得しjsonObjectます。

jsonObjectフィールドもシリアル化するにはどうすればよいですか?

アップデート:

トーマスのコメントを読んだ後、私は地図を使ってみました:

public static class MyJSON implements Serializable {
    private final String name = "myname";
    private final Map somefield = new HashMap();

    public String getName() { return name; }
    public Map getSomefield() { return somefield; }

    public void addOther(String key, String value) {
        somefield.put(key, value);
    }

}

        MyJSON myJSON = new MyJSON();
        myJSON.addOther("mhykey", "myvalue");
        return Response.ok(myJSON, MediaType.APPLICATION_JSON).build();

今、私は再び得る:

{
  "name": "myname" // where is the other field? (the map)
}

なぜシリーズ化しないのだろうか?json はあるシナリオでは特定のフィールド、別のシナリオでは他のフィールドで異なる可能性があるため、特定のオブジェクトを使用できないことに注意してください。そのような場合ごとに新しいクラスを作成することはできません。

4

1 に答える 1

1

これがクラスをシリアル化する方法である場合

{
    "name": "value",
    "mykey": "myvalue"
}

次に、これはオブジェクトがどのように見えるかです

class Data { 
    String name, String mykey;

    // getters, setters...
}

あるいは、@Thomas が HashMap と言ったとき、彼は HashMap をオブジェクトに「入れ子にする」という意味ではなく、文字通り HashMap を使用することを意味していましたが、すべての JSON ライブラリがそのコンストラクターをサポートしているわけではありません。

HashMap<String, String> data = new HashMap<String, String>(); 
data.put("name", "value");
data.put("mykey", "myvalue");

JSONObject json = new JSONObject(data);
String jsonString = json.toString();

他にできることは、オブジェクトを JSONObject 自体として扱うことです。

class Data extends JSONObject {

    public Data() { }

}
Data d = new Data();
d.put("name", "value");

しかし、それはばかげているようです。

于 2016-08-03T15:13:42.967 に答える