簡體   English   中英

使用Jackson讀取Json文件以獲取以下Json結構並獲取對象

[英]Read Json file using Jackson for the following Json structure and Obtain the Object

我能讀取一個簡單的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的值是一個列表

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

你可以幫助我重新編寫列表中內部映射值的值,並反序列化json並將json作為對象

首先,您應該更多地了解Java的命名約定...例如ReadJson而不是readjsonString[] args而不是String Args[] - 它更方便,更容易閱讀。

現在你的問題......請注意你的ReadJson必須反映與JSON數據相同的結構 - 所以它必須是一個帶有字符串鍵的映射來映射值。 后者再次使用字符串鍵和字符串值列表。

您可以使用以下代碼反序列化:

Map<String, Map<String, List<String>>> readJson = MAPPER.readValue(inputjson, new TypeReference<Map<String, Map<String, List<String>>>>() {});

所以要完整:

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

如您所見,此方法不再需要專用數據類(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<String> listOfFirstInnerMap = readJson.get("key1").get("value1");
List<String> listOfSecondInnerMap = readJson.get("key2").get("value2");

您的json映射到此Java對象:

Map<String, Map<String, String[]>>

以下是一些可以構建的代碼:

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

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM