Java 使用Jackson读取以下Json结构的Json文件并获取对象

Java 使用Jackson读取以下Json结构的Json文件并获取对象,java,json,object,jackson,json-deserialization,Java,Json,Object,Jackson,Json Deserialization,我能够读取一个简单的json文件,它有一个键值对,代码是 import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.

我能够读取一个简单的json文件,它有一个键值对,代码是

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
public class readconfig {
    public static void main(String Args[]) throws JsonParseException, JsonMappingException, IOException{
        // String inputjson = "{\"key1\":\"value1\", \"key2\":\"value2\", \"key3\":\"value3\"}"; 
        ObjectMapper mapper= new ObjectMapper();
        // readjson mp =mapper.readValue(inputjson, readjson.class);
        readjson mp =mapper.readValue(new FileInputStream("sam.json"), readjson.class );
        System.out.println(mp.getKey1());
    }
}

import java.io.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.codehaus.jackson.map.ObjectMapper;
public class readjson {
    public String k1;
    public String k2;
    public String k3;
    public key1 key;

    public key1 getKey() {
        return key;
    }
    public void setKey(key1 key) {
        this.key = key;
    }
    public String getKey1() {
        return k1;
    }
    public void setKey1(String key1) {
        this.k1 = key1;
    }
    public String getKey2() {
        return k2;
    }
    public void setKey2(String key2) {
        this.k2 = key2;
    }
    public String getKey3() {
        return k3;
    }
    public void setKey3(String key3) {
        this.k3 = key3;
    }
}
问题是我的json文件很复杂 这是我的json文件,它是map的map,内部map的值是一个列表

{
 "key1":
  { "value1":
      ["listele1",
       "listele2"
      ]
  },
 "key2":
  { "value2":
     ["listele1",
     "listele2"
     ]
  },
 "key3":
 { "value3":
     ["listele1",
     "listele2"
     ]
  }
}

你能帮我重新定义列表中内部映射值的值,并反序列化json并将json作为对象获取吗?首先,你应该更多地遵守Java的命名约定…例如
ReadJson
而不是
ReadJson
String[]args
而不是
String[]args
–它更方便、更容易阅读

现在谈谈您的问题……请注意,您的
ReadJson
必须反映与JSON数据相同的结构,因此它必须是一个带有字符串键的映射,以映射值。后一种方法同样具有字符串键和字符串值列表

此集合可以使用以下代码进行反序列化:

Map<String, Map<String, List<String>>> readJson = MAPPER.readValue(inputjson, new TypeReference<Map<String, Map<String, List<String>>>>() {});
Map readJson=MAPPER.readValue(inputjson,new TypeReference(){});
因此,要完成:

public class LearningTest {
    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
        String inputJson = "{ \"key1\": { \"value1\": [\"listele1\", \"listele2\" ] }, \"key2\": { \"value2\": [\"listele1\", \"listele2\" ] } }";
        Map<String, Map<String, List<String>>> readJson = new ObjectMapper().readValue(inputJson,
                new TypeReference<Map<String, Map<String, List<String>>>>() {
                });
        System.out.println(readJson.get("key1").get("value1").get(0));
    }
}
公共类学习测试{
公共静态void main(字符串[]args)抛出JsonParseException、JsonMappingException、IOException{
字符串inputJson=“{\'key1\':{\'value1\':[\'listele1\',\'listele2\']},\'key2\':{\'value2\':[\'listele1\',\'listele2\']}”;
Map readJson=new ObjectMapper().readValue(inputJson,
新类型引用(){
});
System.out.println(readJson.get(“key1”).get(“value1”).get(0));
}
}
如您所见,这种方法不再需要专门的数据类(ReadJson.java)

如果希望将所有列表元素都放在一个列表中,可以这样实现:

List<String> elements = readJson.values()             // Collection<Map<String, List<String>>>
    .stream()                                         // Stream<Map<String, List<String>>>
    .flatMap(value -> value.values().stream())        // Stream<List<String>>
    .flatMap(listOfStrings -> listOfStrings.stream()) // Stream<String>
    .collect(Collectors.toList());                    // List<String>

System.out.println(elements);
List elements=readJson.values()//集合
.stream()//流
.flatMap(值->值.values().stream())//流
.flatMap(listOfStrings->listOfStrings.stream())//流
.collect(Collectors.toList());//列表
系统输出打印项次(元素);
或者您可以访问单个列表,如:

List<String> listOfFirstInnerMap = readJson.get("key1").get("value1");
List<String> listOfSecondInnerMap = readJson.get("key2").get("value2");
List listOfFirstInnerMap=readJson.get(“key1”).get(“value1”);
List listOfSecondInnerMap=readJson.get(“key2”).get(“value2”);

您的json映射到此Java对象:

Map<String, Map<String, String[]>>
Map
以下是一些可以用来构建的代码:

import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.HashMap;
import java.util.Map;

public class TestJson {
    public static void main(String[] args) throws Exception {
        Map<String, Map<String, String[]>> myFile = new HashMap<>();

        Map<String, String[]> subMap1 = new HashMap<>();
        Map<String, String[]> subMap2 = new HashMap<>();
        Map<String, String[]> subMap3 = new HashMap<>();

        String[] myArray = new String[] {"listele1", "listele2"};

        subMap1.put("value1", myArray);
        subMap2.put("value2", myArray);
        subMap3.put("value3", myArray);

        myFile.put("key1", subMap1);
        myFile.put("key2", subMap2);
        myFile.put("key3", subMap3);

        ObjectMapper mapper = new ObjectMapper();

        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(myFile));

    }
}
import com.fasterxml.jackson.databind.ObjectMapper;
导入java.util.HashMap;
导入java.util.Map;
公共类TestJson{
公共静态void main(字符串[]args)引发异常{
Map myFile=new HashMap();
Map subMap1=新的HashMap();
Map subsp2=新的HashMap();
Map subMap3=新的HashMap();
字符串[]myArray=新字符串[]{“listele1”、“listele2”};
子P1.put(“值1”,myArray);
subsp2.put(“value2”,myArray);
子p3.put(“值3”,myArray);
myFile.put(“key1”,submp1);
myFile.put(“key2”,subsp2);
myFile.put(“key3”,submp3);
ObjectMapper mapper=新的ObjectMapper();
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(myFile));
}
}

谢谢,现在可以获取对象了。现在我想获取列表元素。根据我的示例,需要获取列表1,它是内部映射的一个值。你能帮我吗?你想获取列表元素吗?嗯,如果我理解正确的话,你可以从内部地图上得到相应的信息。我已经相应地更新了我的答案。是的,再次感谢你的回答。你能帮我一次获取所有元素吗?我已经在上面的代码片段中添加了获取所有列表元素的功能。如果答案有效,请随意接受或投票。上面的代码为我提供了json结构中所有列表的所有元素,但我只需要一个列表的元素,你能帮我解决这个问题吗