Java JSON 序列化和 JSON 对象
Java JSON serialization and JSONObject
我试过这个:
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"
}
如您所见,我只得到 MyJSON
的 name
字段而没有 jsonObject
字段。
有什么想法可以让 jsonObject
字段也序列化吗?
更新:
阅读 Thomas 的评论后,我尝试使用地图:
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 在一种情况下某些字段在另一种情况下可能会有所不同其他字段,我无法为每个这样的情况创建一个新的 class。
如果这是您希望 class 序列化的方式
{
"name": "value",
"mykey": "myvalue"
}
那么你的对象应该是这样的
class Data {
String name, String mykey;
// getters, setters...
}
或者,当@Thomas 说,一个 HashMap 时,他并不是说 "nest" 一个 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();
您可以做的另一件事就是将您的对象视为 JSON对象本身。
class Data extends JSONObject {
public Data() { }
}
Data d = new Data();
d.put("name", "value");
不过,这似乎很愚蠢。
我试过这个:
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"
}
如您所见,我只得到 MyJSON
的 name
字段而没有 jsonObject
字段。
有什么想法可以让 jsonObject
字段也序列化吗?
更新:
阅读 Thomas 的评论后,我尝试使用地图:
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 在一种情况下某些字段在另一种情况下可能会有所不同其他字段,我无法为每个这样的情况创建一个新的 class。
如果这是您希望 class 序列化的方式
{
"name": "value",
"mykey": "myvalue"
}
那么你的对象应该是这样的
class Data {
String name, String mykey;
// getters, setters...
}
或者,当@Thomas 说,一个 HashMap 时,他并不是说 "nest" 一个 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();
您可以做的另一件事就是将您的对象视为 JSON对象本身。
class Data extends JSONObject {
public Data() { }
}
Data d = new Data();
d.put("name", "value");
不过,这似乎很愚蠢。