【发布时间】:2017-01-04 20:55:19
【问题描述】:
我可以用ObjectMapper 类解析嵌套的 json 字符串。这里的问题是解析嵌套的 json 变得越来越困难,因为我必须编写大量样板代码来实现将 json 解析为 java 对象的最终结果。除了这种方式,spring还有什么更好的解析方式吗?
领域类:
组件类
public class Components {
private String name;
private String url;
private List<Properties> properties;
// getters and setters
}
属性类:
public class Properties {
private String name;
private String value;
private boolean exclusions;
// getters and setters
}
控制器类:
@RestController
public class TempController {
String jsonResponse = null;
@RequestMapping("/")
public @ResponseBody String getResponse(){
JsonreadApplication ja = new JsonreadApplication();
jsonResponse = ja.readJsonFile();
//System.out.println(jsonResponse);
return jsonResponse;
}
@RequestMapping("/temp")
public @ResponseBody String getTempByServerType(String jsonResponse){
jsonResponse = getResponse();
Components components = new Components();
ObjectMapper objectMapper = new ObjectMapper();
try {
Iterator<Entry<String, JsonNode>> fieldNames = objectMapper.readTree(jsonResponse).fields();
while(fieldNames.hasNext()){
System.out.println(fieldNames.next());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "I've parsed json!";
}
}
json 文件:
{
"name": "CatalogTools",
"url": "/atg/commerce/catalog/CatalogTools/",
"properties": [
{
"name": "queryASAFFabrics",
"value": "skuType=\"ASAF_FABRIC\" AND NOT basicColor IS NULL ORDER BY dynamicAttributes.fabricpriceband, basicColor, dynamicAttributes.fabrictype, dynamicAttributes.asafpattern, dynamicAttributes.asaffabricbrand",
"exclusions": "false"
},
{
"name": "loggingDebug",
"value": "true",
"exclusions": "false"
}
]
}
如前所述,可以使用 ObjectMapper 实例进行解析,但需要使用大量样板代码和硬编码 json 元素名称。有没有更好的方法来做到这一点?我正在使用jackson 库来解析 json 文件。
我在网上引用了许多链接,其中@RequestBody 注释用于HTTP POST 操作。在这里,它是一个HTTP GET 请求。
非常感谢任何帮助。
非常感谢。
【问题讨论】:
-
你试过
public @ResponseBody String getTempByServerType(@RequestBody Components components)吗? -
@RequestBody 注解仅用于 http POST 操作。在这里,我正在使用 GET 操作,我找不到适合我的问题的链接。如果您能将回答此问题的参考链接传递给我,那就太好了。
-
您应该不在 GET 请求中发送复杂的 JSON(或任何 JSON)作为查询参数。主要原因:URLs are limited in size。但是,如果您绝对必须,您是否尝试过
readValue()而不是readTree()? -
对不起,我是 spring 新手。我没有将参数作为 url 传递给 getTempByServerType,而是作为字符串传递。如果需要,我可以删除它,因为我已经在全局声明了变量 jsonResponse。除了大小之外我不应该发送复杂 json 的任何其他原因?
-
@Andreas,感谢您的回答,是的。我可以在 ObjectMapper 实例中尝试其他可能的方法,但是有没有办法通过使用更少代码的 spring-jackson API 来跳过它?再次感谢。
标签: java json spring spring-boot jackson