我正在学习如何在Rest服务中生成和使用JSON,但我想很好地学习它,因此我尝试了所有可能的对象情况,其中之一是具有此类的List属性的对象:
import java.util.List;
public class PruebaJSON {
private String nombre;
private List atributos;
private String descripcion;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public List getAtributos() {
return atributos;
}
public void setAtributos(List atributos) {
this.atributos = atributos;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
}
然后,我在我的休息服务方法上所做的全部就是这样:
@POST
@Path("/prueba")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public PruebaJSON prueba(String data) {
try {
JSONObject json = new JSONObject(data);
Gson convertir = new GsonBuilder().create();
PruebaJSON pruebaJson = convertir.fromJson(json.toString(), PruebaJSON.class);
return pruebaJson;
} catch (Exception e) {
System.out.println("error " + e);
return null;
}
}
然后在POSTMAN中通过:
{
"descripcion": "Primera prueba",
"nombre": "Prueba 1",
"atributos": [
"hello",
"kek",
"lul"
]
}
它工作正常,问题是当我尝试通过Java进行相同操作时,例如:
List atributos = new ArrayList<>();
atributos.add("hello");
atributos.add("kek");
atributos.add("lul");
System.out.println(bus.prueba("Prueba 1", "Primera Prueba", atributos));
bus.prueba只是执行服务,但随后在控制台中出现此错误:
14:16:56,567 INFO [stdout] (default task-2) error com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 66 path $.atributos
我搜索了错误,发现了这一点: Gson: Expected begin_array but was STRING
我了解错误,但解决方案是什么? 我真的无法控制JSON如何构建arraylist吗? 这是我客户端中的prueba方法:
public String prueba(String nombre, String descripcion, List atributos) {
HashMap map = new HashMap<>();
map.put("nombre", nombre);
map.put("descripcion", descripcion);
map.put("atributos", atributos);
String respuesta = utilidadesRestSeguridad.consumir("prueba", map);
return respuesta;
}
在我的客户端组件中,这是构建json的方法:
public static JsonObject generateJSON(HashMap map) throws MalformedURLException {
JsonObject json = new JsonObject();
for (Object key : map.keySet()) {
json.addProperty(key.toString(), map.get(key).toString());
}
return json;
}
如果您想查看更多代码,或者我要解释什么,那就告诉我,我感谢您的帮助。
我认为可能是由于.toString()而导致的错误是在generateJSON方法中,但是那我应该如何处理呢?
答案 0 :(得分:1)
假设行utilidadesRestSeguridad.consumir("prueba", map)
最终在下游调用您的generateJSON
方法,那么您可能会怀疑generateJSON()
方法中的问题。基本上,您只是将所有元素添加为字符串。如果map
中的元素之一是List
的实例,那么您需要调用JsonObject#add("atributos", value)
。例如,您将需要以下代码:
if (map.get(key) instanceof List) {
json.add(key.toString(), map.get(key);
} else {
json.addProperty(key.toString(), map.get(key).toString());
}
答案 1 :(得分:1)
我怀疑,错误出在generateJSON方法中,需要添加entpnerd建议的验证:
public static JsonObject generateJSON(HashMap map) throws MalformedURLException {
JsonObject json = new JsonObject();
for (Object key : map.keySet()) {
if (map.get(key) instanceof List) {
JsonParser parser = new JsonParser();
parser.parse((map.get(key).toString()));
json.add(key.toString(), parser.parse((map.get(key).toString())));
} else {
json.addProperty(key.toString(), map.get(key).toString());
}
}
return json;
}
请注意,我必须使用JsonParser,但不确定其工作原理,但最后还是使其工作了。
来源:How to parse this JSON String with GSON?
无论如何,我都会尝试entpnerd建议的解决方案并将其发布。
这是企业建议的实现:
public static JsonObject generateJSON(HashMap map) throws MalformedURLException {
JsonObject json = new JsonObject();
for (Object key : map.keySet()) {
if (map.get(key) instanceof List) {
JsonArray jsonArray = new JsonArray();
for (Object object : (ArrayList<Object>) map.get(key)) {
jsonArray.add(object.toString());
}
json.add(key.toString(), jsonArray);
} else {
json.addProperty(key.toString(), map.get(key).toString());
}
}
return json;
}
它也可以工作,你们决定使用哪个,非常感谢。
我唯一的问题是,如果作为数组的元素内部有更多的数组,您将怎么办?
答案 2 :(得分:0)
您不需要手动获取json值,只需将requestbody注释添加到方法参数中
public PruebaJSON prueba(@RequestBody PruebaJSON json){
System.out.println(json);
};