2016-08-03 17 views
1

Ich versuchte dies:Java JSON Serialisierung und 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(); 
} 

die Antwort, die ich erhalten:

{ 
    "name": "myname" 
} 

wie Sie ich sehe, erhalten nur die name Feld MyJSON ohne jsonObject Feld.

irgendwelche Ideen wie bekomme ich die jsonObject Felder auch serialisiert?

UPDATE:

nachdem ich Thomas Kommentar zu lesen versucht, eine Karte mit:

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(); 

Jetzt bekomme ich wieder:

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

ich wieder fragen, warum es nicht serialisiert ? Bitte beachten Sie, dass ich bestimmte Objekte nicht verwenden kann, da der JSON in einem Szenario bestimmte Felder in einem anderen Szenario andere Felder variieren kann, kann ich keine neue Klasse für jeden Fall erstellen.

+1

Haben Sie versucht, eine einfache 'Map ' anstelle von 'JSONObject' zu verwenden? Da das Pojo zu json serialisiert ist, könnte der Mapper Probleme haben, wenn er direkt auf 'JSONObject' trifft. Darüber hinaus könnte es besser sein, spezifische Objekte sowieso zu verwenden, d. H. Anstelle einer Karte könnten Sie ein verschachteltes Pojo bereitstellen, das das 'mykey'-Feld aufweist. – Thomas

+1

Wie möchten Sie, dass es serialisiert wird? –

+0

@Thomas aktualisiert Frage (siehe UPDATE) nach Ihrem Vorschlag. – Jas

Antwort

1

Wenn dies, wie Sie die Klasse wollen

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

serialisiert werden Dann ist, wie Sie Ihr Objekt wie

class Data { 
    String name, String mykey; 

    // getters, setters... 
} 

Alternativ aussehen sollte, wenn @Thomas sagte ein HashMap, tat er nicht bedeuten "Nest" eine HashMap in das Objekt, er bedeutete buchstäblich eine HashMap verwenden, obwohl nicht alle JSON-Bibliotheken diesen Konstruktor unterstützen.

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(); 

Eine andere Sache, die Sie tun könnten, ist nur behandeln Sie Ihr Objekt als JSONObject selbst.

class Data extends JSONObject { 

    public Data() { } 

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

Obwohl, das scheint dumm.