java - read - json parser



如何使用簡單的JSON庫將json文件讀入java (8)

我想用json簡單庫用java讀取這個JSON文件。

我的JSON文件如下所示:

[  
    {  
        "name":"John",
        "city":"Berlin",
        "cars":[  
            "audi",
            "bmw"
        ],
        "job":"Teacher"
    },
    {  
        "name":"Mark",
        "city":"Oslo",
        "cars":[  
            "VW",
            "Toyata"
        ],
        "job":"Doctor"
    }
]

這是我寫的用於讀取此文件的java代碼:

package javaapplication1;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JavaApplication1 {
    public static void main(String[] args) {

        JSONParser parser = new JSONParser();

        try {     
            Object obj = parser.parse(new FileReader("c:\\file.json"));

            JSONObject jsonObject =  (JSONObject) obj;

            String name = (String) jsonObject.get("name");
            System.out.println(name);

            String city = (String) jsonObject.get("city");
            System.out.println(city);

            String job = (String) jsonObject.get("job");
            System.out.println(job);

            // loop array
            JSONArray cars = (JSONArray) jsonObject.get("cars");
            Iterator<String> iterator = cars.iterator();
            while (iterator.hasNext()) {
             System.out.println(iterator.next());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

但我得到以下異常:

線程“main”中的異常java.lang.ClassCastException:org.json.simple.JSONArray無法強制轉換為javaapplication1.JavaApplication1.main中的org.json.simple.JSONObject(JavaApplication1.java:24)

誰能告訴我我做錯了什麼? 整個文件是一個數組,文件的整個數組中有對象和另一個數組(汽車)。 但我不知道如何將整個數組解析成java數組。 我希望有人可以幫助我使用我的代碼中缺少的代碼行。

謝謝


Answer #1

整個文件是一個數組,文件的整個數組中都有對象和其他數組(例如汽車)。

如你所說,JSON blob的最外層是一個數組。 因此,您的解析器將返回JSONArray 。 然後,您可以從數組中獲取JSONObject ...

  JSONArray a = (JSONArray) parser.parse(new FileReader("c:\\exer4-courses.json"));

  for (Object o : a)
  {
    JSONObject person = (JSONObject) o;

    String name = (String) person.get("name");
    System.out.println(name);

    String city = (String) person.get("city");
    System.out.println(city);

    String job = (String) person.get("job");
    System.out.println(job);

    JSONArray cars = (JSONArray) person.get("cars");

    for (Object c : cars)
    {
      System.out.println(c+"");
    }
  }

有關參考,請參閱json簡單解碼示例頁面上的“示例1”。


Answer #2

你可以使用Gson
GSON是一個Java庫,可用於將Java對象轉換為其JSON表示。 它還可用於將JSON字符串轉換為等效的Java對象。

看看這個轉換JSON到Java


Answer #3

對於面臨同樣問題的其他人,可能會有所幫助。您可以將文件作為字符串加載,然後將字符串轉換為jsonobject以訪問值。

import java.util.Scanner;
import org.json.JSONObject;
String myJson = new Scanner(new File(filename)).useDelimiter("\\Z").next();
JSONObject myJsonobject = new JSONObject(myJson);

Answer #4

希望這個例子也有幫助

對於下面的json數組示例,我以類似的方式完成了java編碼,如下所示:

以下是json數據格式:存儲為“EMPJSONDATA.json”

[{“EMPNO”:275172,“EMP_NAME”:“Rehan”,“DOB”:“29-02-1992”,“DOJ”:“10-06-2013”​​,“ROLE”:“JAVA DEVELOPER”},

{“EMPNO”:275173,“EMP_NAME”:“GK”,“DOB”:“10-02-1992”,“DOJ”:“11-07-2013”​​,“角色”:“WINDOWS ADMINISTRATOR”},

{“EMPNO”:275174,“EMP_NAME”:“Abiram”,“DOB”:“10-04-1992”,“DOJ”:“12-08-2013”​​,“ROLE”:“PROJECT ANALYST”}

{“EMPNO”:275174,“EMP_NAME”:“Mohamed Mushi”,“DOB”:“10-04-1992”,“DOJ”:“12-08-2013”​​,“ROLE”:“PROJECT ANALYST”}]

public class Jsonminiproject {

public static void main(String[] args) {

      JSONParser parser = new JSONParser();

    try {
        JSONArray a = (JSONArray) parser.parse(new FileReader("F:/JSON DATA/EMPJSONDATA.json"));
        for (Object o : a)
        {
            JSONObject employee = (JSONObject) o;

            Long no = (Long) employee.get("EMPNO");
            System.out.println("Employee Number : " + no);

            String st = (String) employee.get("EMP_NAME");
            System.out.println("Employee Name : " + st);

            String dob = (String) employee.get("DOB");
            System.out.println("Employee DOB : " + dob);

            String doj = (String) employee.get("DOJ");
            System.out.println("Employee DOJ : " + doj);

            String role = (String) employee.get("ROLE");
            System.out.println("Employee Role : " + role);

            System.out.println("\n");

        }


    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }




}

}

Answer #5

您可以使用jackson庫並只使用這3行將您的json文件轉換為Java Object。

ObjectMapper mapper = new ObjectMapper();
InputStream is = Test.class.getResourceAsStream("/test.json");
testObj = mapper.readValue(is, Test.class);

Answer #6

您可以使用readAllBytes。

return String(Files.readAllBytes(Paths.get(filePath)),StandardCharsets.UTF_8);


Answer #7

示例Json

{
    "per_page": 3,
    "total": 12,
    "data": [{
            "last_name": "Bluth",
            "id": 1,
            "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/calebogden/128.jpg",
            "first_name": "George"
        },
        {
            "last_name": "Weaver",
            "id": 2,
            //"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg",
            "first_name": "Janet"
        },
        {
            "last_name": "Wong",
            "id": 3,
            //"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/olegpogodaev/128.jpg",
            "first_name": "Emma"
        }
    ],
    "page": 1,
    "total_pages": 4
}

First If語句將轉換body的單個數據.Second if語句將區分JsonArray對象

public static String getvalueJpath(JSONObject responseJson, String Jpath ) {
        Object obj = responseJson;
        for(String s : Jpath.split("/"))
            if (s.isEmpty())
                if(!(s.contains("[") || s.contains("]")))
                    obj = ((JSONObject) obj).get(s);
                else
                    if(s.contains("[") || s.contains("]"))
                        obj = ((JSONArray)((JSONObject)obj).get(s.split("\\[")[0])).get(Integer.parseInt(s.split("//[")[1].replaceAll("]", "")));

        return obj.toString();
    }
}

Answer #8
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class Delete_01 {
    public static void main(String[] args) throws FileNotFoundException,
            IOException, ParseException {

        JSONParser parser = new JSONParser();
        JSONArray jsonArray = (JSONArray) parser.parse(new FileReader(
                "delete_01.json"));

        for (Object o : jsonArray) {
            JSONObject person = (JSONObject) o;

            String strName = (String) person.get("name");
            System.out.println("Name::::" + strName);

            String strCity = (String) person.get("city");
            System.out.println("City::::" + strCity);

            JSONArray arrays = (JSONArray) person.get("cars");
            for (Object object : arrays) {
                System.out.println("cars::::" + object);
            }
            String strJob = (String) person.get("job");
            System.out.println("Job::::" + strJob);
            System.out.println();

        }

    }
}




json-simple