Java Jackson-在数组中获取一个条目
我有以下JSON源代码:Java Jackson-在数组中获取一个条目,java,json,jackson,Java,Json,Jackson,我有以下JSON源代码: { "my-systems": [{ "SYSTEM_A": [{ "parameter-name": "a_param1", "parameter-display-name": "parameter 1", "optional": "true" }, {
{
"my-systems": [{
"SYSTEM_A": [{
"parameter-name": "a_param1",
"parameter-display-name": "parameter 1",
"optional": "true"
},
{
"parameter-name": "a_param2",
"parameter-display-name": "Parameter 2",
"optional": "false"
}
]
},
{
"SYSTEM_B": [{
"parameter-name": "b_param1",
"parameter-display-name": "Parameter 1",
"optional": "true"
},
{
"parameter-name": "b_param2",
"parameter-display-name": "Parameter 2",
"optional": "false"
}
]
}
]
}
我试着把它读入map
我有这个代码,我真的不确定它是否是实现我目标的最佳方法
ArrayNode systemsArr = (ArrayNode)jsonDoc.get("my-systems");
if(systemsArr!= null && !systemsArr.isEmpty()){
for(JsonNode systemNode : systemsArr ){
ObjectNode systemObj = (ObjectNode)systemNode;
System.out.println(systemObj .textValue());
}
}
这是一种有效的方法吗?如何获取系统名称(system_A、system_B)并将包含的参数转换为parameters objects数组 如果您所做的只是保持密钥的唯一性,那么使用数组“我的系统”几乎没有什么用处。(我假设您的系统可能不同)。 相反,我建议您按照以下方式格式化JSON数据:
{
"my-systems": [
{
"system-name" : {
"name":"System_A",
"parameters": [
{
"parameter-name": "a_param1",
"parameter-display-name": "parameter 1",
"optional": "true"
},
{
"parameter-name": "a_param2",
"parameter-display-name": "Parameter 2",
"optional": "false"
}
]
}
}
]
}
此方法是干净的,允许您在属性“system name”下捕获系统的名称,并且其参数嵌套在其中。你可以简单地声明一个模型,Jackson(或gson)将简单地处理所有事情
如果您希望单独解析响应,或者对响应没有控制权,则可以选择使用实现,但不需要转换为ObjectNode。您可以在for循环中使用以下示例:
String f2Str = jsonNode.get("f2").asText();
double f2Dbl = jsonNode.get("f2").asDouble();
int f2Int = jsonNode.get("f2").asInt();
long f2Lng = jsonNode.get("f2").asLong();
其中'f2'是您的键,您可以使用node.fieldNames().next()获取键,它实际上是从迭代器获取属性
你也可以尝试下面的方法,它们似乎更容易处理
JsonNode parent = ...;
for (Iterator<String> it = parent.fieldNames() ; it.hasNext() ; ) {
String field = it.next();
System.out.println(field + " => " + parent.get(field));
}
for (Iterator<Map.Entry<String,JsonNode>> it = parent.fields() ;
it.hasNext() ; ) {
Map.Entry<String,JsonNode> e = it.next();
System.out.println(e.getKey() + " => " + e.getValue());
}
JsonNode父节点=。。。;
for(迭代器it=parent.fieldNames();it.hasNext();){
字符串字段=it.next();
System.out.println(field+“=>”+parent.get(field));
}
for(迭代器it=parent.fields();
it.hasNext();){
Map.Entry e=it.next();
System.out.println(e.getKey()+“=>”+e.getValue());
}
最新的例子摘自。希望这能有所帮助。您只需要在依赖项中使用jackson数据绑定和jackson注释jar,就可以运行下面的代码了
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JsonParsing {
public static void main(String[] args) throws IOException {
String jsonFilePath = "src/main/resources/source.json"; // JSON File Path
MySystems mySystems = new ObjectMapper().readValue(new File(jsonFilePath),MySystems.class);
Map<String,SystemParameter[]> outputMap = new HashMap<>();
for (Map<String,List<SystemParameter>> map :mySystems.mySystems) {
for (String key :map.keySet()) {
outputMap.put(key, map.get(key).toArray(new SystemParameter[0]));
}
}
System.out.println(outputMap);
}
}
class MySystems {
@JsonProperty("my-systems")
List<Map<String,List<SystemParameter>>> mySystems;
}
class SystemParameter {
@JsonProperty("parameter-name")
String paramName;
@JsonProperty("parameter-display-name")
String paramDispName;
@JsonProperty("optional")
String optional;
}
import com.fasterxml.jackson.annotation.JsonProperty;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入java.io.File;
导入java.io.IOException;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
公共类JsonParsing{
公共静态void main(字符串[]args)引发IOException{
String jsonFilePath=“src/main/resources/source.json”;//json文件路径
MySystems MySystems=newObjectMapper().readValue(新文件(jsonFilePath),MySystems.class);
Map outputMap=newhashmap();
for(映射:mySystems.mySystems){
for(字符串键:map.keySet()){
outputMap.put(key,map.get(key).toArray(新系统参数[0]);
}
}
System.out.println(outputMap);
}
}
类MySystems{
@JsonProperty(“我的系统”)
列出我的系统;
}
类系统参数{
@JsonProperty(“参数名”)
字符串参数名;
@JsonProperty(“参数显示名称”)
字符串名称;
@JsonProperty(“可选”)
字符串可选;
}
旁注:您能再次检查问题中的JSON吗?它给了我们很多。(我猜它是从一个更大的JSON源中取样的。)@andrewjames完全正确。完成。@Yaron你能接受下面的答案之一,或者解释为什么这些答案不起作用吗?