2016-03-29 6 views
1

zu analysieren Ich habe nicht mit JSON-Daten vorher gearbeitet, also die Frage. Ich habe das folgende JSON-Objekt in einer Datei.JSON-Daten in Modellobjekte in Java

{ 
    "courses": [ 
     { "id":998", "name":"Java Data Structures", "teacherId":"375" }, 
     { "id":"999", "name":"Java Generics", "teacherId":"376" } 

    ], 
    "teachers": [ 
     { "id":"375", "firstName":"Amiyo", "lastName":"Bagchi"}, 
     { "id":"376", "firstName":"Dennis", "lastName":"Ritchie"}  
    ] 
} 

Hier sind meine Modellobjekte.

Meine Aufgabe ist es, die JSON-Objekte zu lesen und eine Liste der Model-Objekte zurückzugeben.

Ich habe die simple.JSON Familie von jar importiert und hier ist mein Code, der die Datei liest.

FileReader reader = new FileReader(path); 
    JSONParser parser = new JSONParser(); 
    Object obj = parser.parse(reader); 

    JSONObject jsonObject = (JSONObject) obj; 

Meine Frage ist,

  1. Wie analysieren ich das JSON-Dokument in meine Modellobjekte?
  2. Wenn die Eingabedatei JSON ist, aber ein anderes Format hat, wie kann ich die Ausnahme auslösen/die Anomalie behandeln?

Jede Hilfe wird geschätzt.

+0

Sie haben ein JSON-Objekt, mit dem Sie analysieren können; http://stackoverflow.com/questions/5015844/parsing-json-object-in-java. Außerdem löst Ihr Code eine Ausnahme aus, wenn er das JSON-Objekt nicht lesen kann, so dass Sie den Typ des JSON ermitteln können, indem Sie sich http://www.w3schools.com/json/json_syntax ansehen.Asp, wenn Sie die Ausnahme erhalten. –

Antwort

2

UPDATE Ich schlage vor, Sie verwenden JSON-Parser, die Daten zu analysieren:

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.HashMap; 
import java.io.IOException; 
import java.nio.charset.StandardCharsets; 
import java.nio.file.Files; 
import java.nio.file.Paths; 

class Course { 

    public int _id; 
    public String _name; 
    public Teacher _teacher; 

    private Course(int id, String name, Teacher teacher){ 
     this._id = id; 
     this._name = name; 
     this._teacher = teacher; 
    } 
    public Course() { 

    } 
} 

class Teacher { 
    public int _id; 
    public String _firstName; 
    public String _lastName; 
    private Teacher(int id, String fname, String lname){ 
     this._id = id; 
     this._firstName = fname; 
     this._lastName = lname; 
    } 
    public Teacher(){ 

    } 

} 

public class jsontest { 

    public static void main(String[] args) throws JSONException, IOException { 

//  String JSON_DATA = "{\n"+ 
//  " \"courses\": [\n"+ 
//  " { \"id\":\"998\", \"name\":\"Java Data Structures\", \"teacherId\":\"375\" },\n"+ 
//  " { \"id\":\"999\", \"name\":\"Java Generics\", \"teacherId\":\"376\" }\n"+ 
//  "\n"+ 
//  " ],\n"+ 
//  " \"teachers\": [\n"+ 
//  " { \"id\":\"375\", \"firstName\":\"Amiyo\", \"lastName\":\"Bagchi\"},\n"+ 
//  " { \"id\":\"376\", \"firstName\":\"Dennis\", \"lastName\":\"Ritchie\"} \n"+ 
//  " ]\n"+ 
//  "}\n"+ 
//  ""; 
     // read json file into string 
     String JSON_DATA = new String(Files.readAllBytes(Paths.get("path_to_json_file")), StandardCharsets.UTF_8); 

     // using a JSON parser 
     JSONObject obj = new JSONObject(JSON_DATA); 
     // parse "teachers" first 
     List<Teacher> listCourses = new ArrayList<Teacher>(); 
     List<JSONObject> listObjs = parseJsonData(obj,"teachers"); 
     for (JSONObject c: listObjs) { 
      Teacher teacher = new Teacher(); 
      teacher._id = c.getInt("id"); 
      teacher._firstName = c.getString("firstName"); 
      teacher._lastName = c.getString("lastName"); 
      listCourses.add(teacher); 
     } 
     // parse "courses" next 
     List<Course> resultCourses = new ArrayList<Course>(); 
     List<JSONObject> listObjs2 = parseJsonData(obj, "courses"); 

     for (JSONObject c: listObjs2) { 
      Course course = new Course(); 
      course._id = c.getInt("id"); 
      course._name = c.getString("name"); 
      int teacherId = c.getInt("teacherId"); 
      HashMap<String, Teacher> map = new HashMap<String, Teacher>(); 
      for (Teacher t: listCourses){ 
       map.put(Integer.toString(t._id), t); 
      } 
      course._teacher = map.get(Integer.toString(teacherId)); 
      resultCourses.add(course); 
     } 
    } 


    public static List<JSONObject> parseJsonData(JSONObject obj, String pattern)throws JSONException { 

     List<JSONObject> listObjs = new ArrayList<JSONObject>(); 
     JSONArray geodata = obj.getJSONArray (pattern); 
     for (int i = 0; i < geodata.length(); ++i) { 
      final JSONObject site = geodata.getJSONObject(i); 
      listObjs.add(site); 
     } 
     return listObjs; 
    } 

} 

Ausgang:

enter image description here

BTW: Die JSON-Daten in dem Beispiel hat einen Wert, das doppelte Anführungszeichen sind nicht in Paaren. Um fortzufahren, muss es behoben werden.

+0

Von welchem ​​Link haben Sie die einfache JSON-Bibliothek heruntergeladen? Ich scheine JSONException zu vermissen. – Zeus

+0

Bitte versuchen Sie dies [URL] (http://www.java2s.com/Code/JarDownload/java/java-json.jar.zip). – Quinn

+0

Das hilft wirklich, nur noch eine Frage, gibt es eine Möglichkeit zu überprüfen, dass die Schlüssel vorhanden sind, bevor Sie sie verwenden. – Zeus

1

Sie sollten stattdessen Jackson als JSON-Parsing-Bibliothek verwenden. Es gibt viel mehr Unterstützung und Funktionen, die damit einhergehen.

In Ihrem Fall sollten einige Anmerkungen zur Zuordnung der JSON-Eigenschaften zu den Java-Feldern ausreichen.

UPDATE: Einige Code, besser zu zeigen, viel kann dies mit Jackson erfolgen.

public class Course { 
    @JsonProperty("id") 
    private int _id; 
    @JsonProperty("name") 
    private String _name; 
    @JsonProperty("teacher") 
    private Teacher _teacher; 
    // ...public getters and setters 
} 

public class Teacher { 
    @JsonProperty("id") 
    private int _id; 
    @JsonProperty("firstName") 
    private String _firstName; 
    @JsonProperty("lastName") 
    private String _lastName; 
    // ...public getters and setters 
} 

// Container class to conform to JSON structure 
public class CoursesDto { 
    private List<Teacher> teachers; 
    private List<Course> courses; 
} 

// In your parser place 
ObjectMapper mapper = new ObjectMapper(); 
FileReader reader = new FileReader(path); 
CoursesDto dto = mapper.readValue(reader, CoursesDto.class); 

Die @JsonProperty Anmerkungen sagen Jackson welche JSON Schlüssel deserialisieren verwendet werden soll. Sie sind nicht erforderlich, wenn die Eigenschaftsnamen den JSON-Schlüsseln entsprechen. Das heißt, wenn Sie den führenden Unterstrich aus Ihren Eigenschaftsnamen entfernen, würde dies ohne Anmerkungen funktionieren. Außerdem verwendet Jackson standardmäßig öffentliche Felder und Getter/Setter-Methoden. Das bedeutet, dass Sie Ihre Felder mit dem Präfix _ beibehalten können, solange der Getter/Setter sie nicht hat (setFirstName(String firstName)).

+1

Das ist weit entfernt davon, eine Antwort zu sein. Sie haben gerade Bibliotheken bereitgestellt. Er sagte, er habe noch nie mit Json gearbeitet. Also muss er die Grundlagen davon kennen. Bitte geben Sie weitere Erklärungen und zeigen Sie einige Code-Schnipsel, wie er mit json umgehen kann, wie er es zur Verfügung gestellt hat. –

Verwandte Themen