Sibainu Relax Room

柴犬と過ごす

Android JSONオブジェクトを配列から作成

今日も天気が穏やかです。12月とは思えない暖かさです。柴犬はひたすら気持ちよく寝ています。

概要

Android端末からPOSTでJSONフォーマットを送信する際、手作業でゴリゴリ文字列を作るのは結構手間がかかります。

特に手間なのが、カッコの開き閉じの関係です。ちょっと複雑になると途端に整合性をとるのが大変です。

そこで、配列、連想配列(ハッシュマップ)を入れ子にしてJSONフォーマットを作れるように考えてみました。

簡単なことですが、いざその場になると記憶を辿るのも時間がかかるので記録します。

次に紹介する本はちょっと過激な表紙ですが、本の内容はまじめてよく理解できる書き方をしています。先の「Androidアプリ開発」で飛ばしているところを丁寧に説明しているので、これで理解が早まりました。お勧めです。

しかもこれが100円で買え、ボリュームがすごい量です。なので著者に感謝です。

app:java: MainActivity.java

今回も AndroidStudio を使います。

肝は次の2行だけです。

        JSONObject json = new JSONObject(map);
        String info = json.toString();

copy

package siba.inu.android.jsontest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tvinfo = findViewById(R.id.tv_info);

        Map<String, Object> map = new HashMap<>();
        map = getjsonmap();

        JSONObject json = new JSONObject(map);
        System.out.println(json);

        String info = json.toString();
        tvinfo.setText(info);
    }

    private Map getjsonmap() {
        Map<String, Object> map = new HashMap<>();

        Map<String, String> hmap0 = new HashMap<>();
        hmap0.put("key01","val01");
        hmap0.put("key02","val02");
        hmap0.put("key03","val03");
        hmap0.put("key04","val04");

        Map<String, String> hmap1 = new HashMap<>();
        hmap1.put("key11","val11");
        hmap1.put("key12","val12");
        hmap1.put("key13","val13");
        hmap1.put("key14","val14");

        Map[] tMaps = new Map[2];
        tMaps[0] = new HashMap<String, Object>();
        tMaps[1] = new HashMap<String, Object>();

        tMaps[0].put("key3",hmap0);
        tMaps[1].put("key4",hmap1);

        map.put("key0", hmap0);
        map.put("key1", hmap1);
        map.put("key5", tMaps);

        String[] value1 = new String[] { "value11", null, null };
        String[] value2 = new String[] { "value21", "value22", "value23" };

        map.put("keyx", value1);
        map.put("keyy", value2);

        return map;
    }
}

app:res:layout: activity_main.xml

copy

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/tv_info"
        android:layout_width="371dp"
        android:layout_height="312dp"
        android:text="入力"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

実行結果

左がスマホの実行結果です。

右は見やすくするため分けました。

"key1":{"key14":"val14","key13":"val13","key12":"val12","key11":"val11"}
"key0":{"key04":"val04","key03":"val03","key02":"val02","key01":"val01"}
"key5":[{"key3":{"key04":"val04","key03":"val03","key02":"val02","key01":"val01"}},{"key4":{"key14":"val14","key13":"val13","key12":"val12","key11":"val11"}}]
"keyy":["value21","value22","value23"]
"keyx":["value11",null,null]

想定した結果になりました。

今日は簡単でしたが、ここまでとします。