2016-03-29 6 views
1

これまではJSONデータを扱っていませんでした。 ファイル内に次のJSONオブジェクトがあります。JSONデータを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"}  
    ] 
} 

ここは私のモデルオブジェクトです。

public class Course { 

    private int _id; 
    private String _name; 
    private Teacher _teacher; 
} 

public class Teacher { 
    private int _id; 
    private String _firstName; 
    private String _lastName; 
} 

私の仕事は、JSONオブジェクトを読み込み、Modelオブジェクトのリストを返すことです。

jarのsimple.JSONファミリをインポートしました。ここにファイルを読み込むコードがあります。

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

    JSONObject jsonObject = (JSONObject) obj; 

私の質問は、私は私のモデルオブジェクトにJSON文書を解析するにはどうすればよい、

  1. のですか?
  2. 入力ファイルがJSONであるが異なる形式の場合例外を処理するにはどうすればよいですか?

助けてください。

+0

あなたは解析できるJSONオブジェクトを持っています。 http://stackoverflow.com/questions/5015844/parsing-json-object-in-javaまた、JSONオブジェクトを読み取ることができない場合、コードは例外をスローします。したがって、http://www.w3schools.com/json/json_syntaxを参照してjsonのタイプを判別できます。あなたが例外を取得したときにASP。 –

答えて

2

UPDATE私はあなたがデータを解析するJSONパーサーを使用することをお勧め:

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

} 

出力:ところで

enter image description here

例ではJSONデータは、その一つの値を持っています二重引用符はペアではありません。続行するには、修正する必要があります。

+0

シンプルなJSONのlibをどのリンクからダウンロードしましたか。 JSONExceptionが見つからないようです。 – Zeus

+0

この[URL](http://www.java2s.com/Code/JarDownload/java/java-json.jar.zip)を試してください。 – Quinn

+0

これは実際にもう1つの質問ですが、使用する前にキーが存在するかどうかを確認する方法があります。 – Zeus

1

JSON解析ライブラリとしてJacksonを使用するようにしてください。それに付随する多くのサポートと機能があります。

JSONプロパティをJavaフィールドにマップするためのアノテーションをいくつか追加するだけで十分です。

UPDATE:一部のコード、これはジャクソンで行うことができるだけではるかに優れて表示します。

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

@JsonProperty注釈は、JSONのキーをデシリアライズするために使用すべきかジャクソンを教えてください。プロパティ名がJSONキーと一致する場合は不要です。これは、プロパティ名から先頭のアンダースコアを削除すると、注釈なしで機能することを意味します。また、Jacksonはパブリックフィールドとgetter/setterメソッドの使用をデフォルトにします。これは、ゲッター/セッターにそれがない限り(setFirstName(String firstName))、フィールドの先頭に_を置くことができることを意味します。

+1

これは答えではありません。あなたはライブラリを提供したばかりです。彼は前にjsonと仕事をしていないと言いました。だから、彼はそれの基礎を知る必要があります。より多くの説明を提供し、彼が提供したようなjsonでどのように処理できるかについてのコードスニペットをいくつか示してください。 –

関連する問題