Android手動によるJsonの作成と解析

28904 ワード

  • 概要

  • jsonのフォーマット紹介
  • 1 json対象
  • 2 json配列
  • Androidが持参したJson操作類
  • 1 JSONObject
  • 11 JSOnObject基本紹介
  • 12 JSOnObjectインスタンス
  • 2 JSONArray
  • 3 JSONStringer
  • 4 JSONTokener
  • JsonReader
  • JsonWriter



  • 概要
    現在Android開発で作成・解析Jsonの多くはGsonやfastJsonなどのマッピング可能なオブジェクトのサードパーティライブラリを利用しており、確かに非常に便利で、Gson解析を使うには私の別の文章を参考にGson解析やjsonを作成することができますが、手動で解析する必要がある場合があります.本稿では,サードパーティ製ライブラリを使用することなく,Androidが持つJsonObjectなどのクラスを直接使用してjsonを作成し解析し,小さなDemoを用意した.
    1 jsonのフォーマット紹介
    1.1 jsonオブジェクト
    {"name": "jadyli", "gender": "male"}

    オブジェクトはキー値のペアとして表され、データはカンマで区切られ、カッコでオブジェクトを保存し、キー名を二重引用符で包み、コロンでキーと値を区切る.値がStringタイプで、二重引用符またはコロンが含まれている場合は、「」を使用します.
    1.2 json配列
    [
        {"name": "jadyli", "gender": "male"},
        {"name": "sanqi", "gender": "male"}
    ]

    かっこは配列を保存します.
    2 Androidが持参したJson操作類
    2.1 JSONObject
    2.1.1 JSOnObject基本紹介
    Android公式の紹介は
    A modifiable set of name/value mappings. Names are unique, non-null strings. Values may be any mix of JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL. Values may not be null, NaNs, infinities, or of any type not listed here.
    変更可能なキー値ペアのマッピングセット.キーは一意で、空ではない文字列です.値は、JSONObjects、JSOnArrays、Strings、Booleans、Integers、Longs、DoubleまたはNULLの任意の組み合わせです.値はnull,NaNs,infinitiesではないか,あるいは任意のここで列挙されていないタイプである可能性もある.
    いくつかの一般的な方法は、Android JSOnObjectクラスを参照してください.
    メソッド名(パラメータ)
    説明
    get(String name)
    キーマッピングの値を返し、見つからない場合は例外を放出します.
    getInt(String name)
    int値を返し、見つからない場合は例外を放出
    getString(String name)
    String値を返し、見つからない場合は例外を放出します.
    opt(String name)
    キーマッピングの値を返し、見つからない場合nullを返します.
    optString(String name, String fallback)
    キーマッピングの値を返し、見つからない場合はメソッドパラメータのfallbackを返します.
    optString(String name)
    キーマップの値を返し、見つからない場合は空の文字列を返します.
    put(String name, Object value)
    キーを値にマップします.このオブジェクトにこのキーが存在する場合、前のキーが上書きされます.
    put(String name, int value)
    キーを値にマップします.このオブジェクトにこのキーが存在する場合、前のキーが上書きされます.
    getJSONObject(String name)
    JSOnObjectに戻り、見つからない場合は例外を投げ出す
    getJSONArray(String name)
    JSOnArray値を返し、見つからない場合は例外を放出
    keys()
    Iteratorを返します.このオブジェクトのキーの集合反復器です.
    names()
    JSOnArrayを返します.このオブジェクトのキーの配列です.
    length()
    このオブジェクトのデータバーの数を返します
    has(String name)
    このオブジェクトにこのキーのマッピングがあるかどうかを判断する
    isNull(String name)
    このオブジェクトにこのキーのマッピングがあるかどうか、またはNULLの判定値
    toString()
    このオブジェクトをjson列に変換します.たとえば、{"query":"Pizza","locations":[9404390210]}
    toString(int indentSpaces)
    このオブジェクトをjson列に変換すると、改行やインデントが表示され、読みやすくなります
    JSOnObject()コンストラクションメソッドを呼び出し、空のJSOnObjectを作成するか、JSOnObject(String json)を呼び出してjson文字列を入力します.
    2.1.2 JSOnObjectの例
    上記の方法を用いると,一般的なjson文字列を解析して作成することができる.このjson文字列を例にとります.
    {"name": "jadyli", "gender": "male", "age": 18}

    jsonの作成
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("name", "jadyli");
    jsonObject.put("gender", "male");
    jsonObject.put("age", 18);
    System.out.println(jsonObject.toString(1));

    しゅつりょく
    {“name”:”jadyli”,”gender”:”male”,”age”:18}
    解析json
    String json = "{\"name\": \"jadyli\", \"gender\": \"male\", \"age\": 18}";
    JSONObject jsonObject = new JSONObject(json);
    System.out.println("  :" + jsonObject.getString("name"));
    System.out.println("  :" + jsonObject.getString("gender"));
    System.out.println("  :" + jsonObject.getString("age"));

    2.2 JSONArray
    JSOnArray JSOnArrayの仕様はJSOnObjectとほぼ一致しています.JSOnObjectとJSOnArrayを併用した小例をあげます.
    {
      "students": [
        {
          "name": "jadyli",
          "gender": "male",
          "age": 18
        },
        {
          "name": "Juliet",
          "gender": "female",
          "age": 20
        }
      ]
    }

    jsonの作成
    String[] names = {"jadyli", "Juliet"};
    String[] genders = {"male", "female"};
    int[] ages = {18, 20};
    JSONArray students = new JSONArray();
    for (int i = 0; i < names.length; i++) {
        JSONObject student = new JSONObject();
        student.put("name", names[i]);
        student.put("gender", genders[i]);
        student.put("age", ages[i]);
        students.put(student);
    }
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("students", students);
    System.out.println(jsonObject.toString(1));

    しゅつりょく
    {“students”:[{“name”:”jadyli”,”gender”:”male”,”age”:18},{“name”:”Juliet”,”gender”:”female”,”age”:20}]}
    解析json
    String json = "{"students":[{"name":"jadyli","gender":"male","age":18},
                             {"name":"Juliet","gender":"female","age":20}]}";
    JSONObject jsonObject = new JSONObject(json);
    JSONArray students = jsonObject.getJSONArray("students");
    for (int i = 0; i < students.length(); i++) {
         JSONObject student = students.getJSONObject(i);
         System.out.println("  :" + student.getString("name"));
         System.out.println("  :" + student.getString("gender"));
         System.out.println("  :" + student.getInt("age") + "
    "
    ); }

    2.3 JSONStringer
    メソッドはJSOnStringerを参照して、主にこのクラスを使用してjsonを作成します.
    {
      "students": [
        {
          "name": "jadyli",
          "gender": "male",
          "age": 18
        },
        {
          "name": "Juliet",
          "gender": "female",
          "age": 20
        }
      ]
    }
    JSONStringer jsonStringer = new JSONStringer();
    jsonStringer.object();
    
    jsonStringer.key("students");
    jsonStringer.array();
    String[] names = {"jadyli", "Juliet"};
    String[] genders = {"male", "female"};
    int[] ages = {18, 20};
    for (int i = 0; i < names.length; i++) {
        jsonStringer.object();
        jsonStringer.key("name");
        jsonStringer.value(names[i]);
        jsonStringer.key("gender");
        jsonStringer.value(genders[i]);
        jsonStringer.key("age");
        jsonStringer.value(ages[i]);
        jsonStringer.endObject();
    }
    jsonStringer.endArray();
    
    jsonStringer.endObject();
    
    System.out.println(jsonStringer.toString());

    しゅつりょく
    {“students”:[{“name”:”jadyli”,”gender”:”male”,”age”:18},{“name”:”Juliet”,”gender”:”female”,”age”:20}]}
    2.4 JSONTokener
    方法参考JSONTokener
    このクラスは主にjsonを解析するために用いられる.JSONTokenerを使用して、次のjsonを解析します.
    {
      "students": [
        {
          "name": "jadyli",
          "gender": "male",
          "age": 18
        },
        {
          "name": "Juliet",
          "gender": "female",
          "age": 20
        }
      ]
    }
    JSONTokener jsonTokener = new JSONTokener("{\"students\":[" +
                                "{\"name\":\"jadyli\",\"gender\":\"male\",\"age\":18}," +
                                "{\"name\":\"Juliet\",\"gender\":\"female\",\"age\":20}]}");
    JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();
    JSONArray students = jsonObject.getJSONArray("students");
    for (int i = 0; i < students.length(); i++) {
         JSONObject student = students.getJSONObject(i);
         System.out.println("  :" + student.getString("name"));
         System.out.println("  :" + student.getString("gender"));
         System.out.println("  :" + student.getInt("age") + "
    "
    ); }

    ただnextValue()を使ってjsonをJSOnObjectと読みました.JSONTokenerの主な役割は、jsonの文字を読み取ることであり、一般的には使用されません.
    System.out.println(jsonTokener.next()); //     
    jsonTokener.skipPast("name"); //   name  
    System.out.println(jsonTokener.next(2));//     

    JsonReader
    ここでのJsonReaderとは、android.utilで包まれたものであり、gsonではない.公式のdemoを直接参考にすることができます.
    このようなjson入力ストリームがあると仮定する.
    [
      {
        "id": 912345678901,
        "text": "How do I read JSON on Android?",
        "geo": null,
        "user": {
          "name": "android_newb",
          "followers_count": 41
        }
      },
      {
        "id": 912345678902,
        "text": "@android_newb just use android.util.JsonReader!",
        "geo": [
          50.454722,
          -104.606667
        ],
        "user": {
          "name": "jesse",
          "followers_count": 2
        }
      }
    ]
    JsonReaderを使用して、上記jsonを解析します.
    public List readJsonStream(InputStream in) throws IOException {
        JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
        try {
            return readMessagesArray(reader);
        }
        finally {
            reader.close();
        }
    }
    public List readMessagesArray(JsonReader reader) throws IOException {
        List messages = new ArrayList();
        reader.beginArray();
        while (reader.hasNext()) {
            messages.add(readMessage(reader));
        }
        reader.endArray();
        return messages;
    }
    public Message readMessage(JsonReader reader) throws IOException {
        long id = -1;
        String text = null;
        User user = null;
        List<double> geo = null;
        reader.beginObject();
        while (reader.hasNext()) {
            String name = reader.nextName();
            if (name.equals("id")) {
                id = reader.nextlong();
            } else if (name.equals("text")) {
                text = reader.nextString();
            } else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {
                geo = readDoublesArray(reader);
            } else if (name.equals("user")) {
                user = readUser(reader);
            } else {
                reader.skipValue();
            }
        }
        reader.endObject();
        return new Message(id, text, user, geo);
    }
    public List<double> readDoublesArray(JsonReader reader) throws IOException {
        List<double> doubles = new ArrayList<double>();
        reader.beginArray();
        while (reader.hasNext()) {
            doubles.add(reader.nextdouble());
        }
        reader.endArray();
        return doubles;
    }
    public User readUser(JsonReader reader) throws IOException {
        String username = null;
        int followersCount = -1;
        reader.beginObject();
        while (reader.hasNext()) {
            String name = reader.nextName();
            if (name.equals("name")) {
                username = reader.nextString();
            } else if (name.equals("followers_count")) {
                followersCount = reader.nextint();
            } else {
                reader.skipValue();
            }
        }
        reader.endObject();
        return new User(username, followersCount);
    }

    上記の方法の詳細については、JsonReaderを参照してください.
    JsonWriter
    ここでのJsonWriterとは、android.utilで包まれたものであり、gsonではない.公式のdemoを直接参考にすることができます.
    このようなjson入力ストリームがあると仮定する.
    [
      {
        "id": 912345678901,
        "text": "How do I write JSON on Android?",
        "geo": null,
        "user": {
          "name": "android_newb",
          "followers_count": 41
        }
      },
      {
        "id": 912345678902,
        "text": "@android_newb just use android.util.JsonWriter!",
        "geo": [
          50.454722,
          -104.606667
        ],
        "user": {
          "name": "jesse",
          "followers_count": 2
        }
      }
    ]
    JsonWriterを使用して、上記jsonを記述します.
    public void writeJsonStream(OutputStream out, List messages) throws IOException {
        JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
        writer.setIndent("  ");
        writeMessagesArray(writer, messages);
        writer.close();
    }
    public void writeMessagesArray(JsonWriter writer, List messages) throws IOException {
        writer.beginArray();
        for (Message message : messages) {
            writeMessage(writer, message);
        }
        writer.endArray();
    }
    public void writeMessage(JsonWriter writer, Message message) throws IOException {
        writer.beginObject();
        writer.name("id").value(message.getId());
        writer.name("text").value(message.getText());
        if (message.getGeo() != null) {
            writer.name("geo");
            writeDoublesArray(writer, message.getGeo());
        } else {
            writer.name("geo").nullValue();
        }
        writer.name("user");
        writeUser(writer, message.getUser());
        writer.endObject();
    }
    public void writeUser(JsonWriter writer, User user) throws IOException {
        writer.beginObject();
        writer.name("name").value(user.getName());
        writer.name("followers_count").value(user.getFollowersCount());
        writer.endObject();
    }
    public void writeDoublesArray(JsonWriter writer, List<double> doubles) throws IOException {
        writer.beginArray();
        for (double value : doubles) {
            writer.value(value);
        }
        writer.endArray();
    }

    上記の方法の詳細についてはJsonWriterを参照してください.
    本明細書のdemoアドレス