2016-08-03 45 views
1

我嘗試這樣做:Java的JSON序列化和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" 
} 

,你看,我只得到的MyJSONname場沒有jsonObject領域。

任何想法我怎麼能得到jsonObject字段也序列化?

UPDATE:

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可能會在其他場景的其他場景的特定字段中改變某個場景,所以我無法爲每個這樣的場景創建一個新類。

+1

您是否嘗試使用簡單的'Map '而不是'JSONObject'?由於pojo被序列化爲json,當直接遇到'JSONObject'時,映射器可能會遇到問題。除此之外,反正使用特定的對象可能會更好,也就是說,您可以提供一個嵌套的pojo,它具有'mykey'字段。 – Thomas

+1

你想如何序列化? –

+0

@Thomas根據您的建議更新了問題(請參閱更新)。 – Jas

回答

1

如果這是你想怎麼類進行序列化

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

那麼這就是你的對象應該什麼樣子

class Data { 
    String name, String mykey; 

    // getters, setters... 
} 

或者,當@Thomas說,一個HashMap,他做到了不意味着將一個HashMap「嵌套」到Object中,但他的字面意思是使用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"); 

雖然,這似乎是愚蠢的。