678 views
この記事は最終更新から 1017日 が経過しています。
1. やりたいこと
Androidプログラム中で JSON形式のデータをデコードしたい。
2. やってみる
(1) Gradleに Jacksonパッケージを追加する。
最新版は以下のサイトで確認する。
https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations
dependencies {
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.7.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.14.1'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.14.1'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.14.1'
}
記述後は、Sync now メニューを選択し、パッケージのダウンロードを実行する。
(2) JSONデータを作る。
[
{
"textA": "山田",
"textB": "神奈川",
"textC": "自転車"
},
{
"textA": "倉沢",
"textB": "京都",
"textC": "バイク"
}
]
(3) JSONデコードのプログラムを書く。
デコード後のデータを格納するクラスを作る。
class Item {
private String textA;
private String textB;
private String textC;
public String GetTextA(){return textA;}
public String GetTextB(){return textB;}
public String GetTextC(){return textC;}
}
データをデコードする処理を書く。
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
void DecodeJson(String jsonText) {
// JSONデータをデコードする。
ObjectMapper jsonMapper = new ObjectMapper().setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
try {
Item[] items = jsonMapper.readValue(jsonText, Item[].class);
// デーコードした内容を表示してみる。
for(Item i : items) {
String msg = String.format("A: %s, B: %s, C: %s", i.GetTextA(), i.GetTextB(), i.GetTextC());
}
} catch (JsonParseException e1) {
e1.printStackTrace();
} catch (JsonMappingException e2) {
e2.printStackTrace();
} catch (JsonProcessingException e3) {
e3.printStackTrace();
}
}
3. 応用
(1) 少し汎用っぽい処理の備忘録
ObjectMapper.readTree()を使い JSONデータから JsonNode型インスタンスで構成される木構造を生成する。
→ ラベル名を指定して任意のノードを取得する。
→ そのノードのJSONデータを取得する。
→ ObjectMapper.readValue()でデコードする。
例として、以下のような JSONデータをデコードするケースについて…
{
"result": "0",
"data" :
[
{"a":"11", "b":"23", "c":"35"},
{"a":"43", "b":"38", "c":"61"},
{"a":"15", "b":"72", "c":"29"}
]
}
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class RestDecoder {
private JsonNode node;
private int resultCode;
ObjectMapper jsonMapper;
// コンストラクタ
public RestDecoder(){
this.resultCode = -1; // 非0(≠正常)で初期化
}
// サーバーから受信したデータ(JSON形式)をデコードする。
public boolean execDecode(String jsonRawData) throws JsonParseException, JsonMappingException, JsonProcessingException {
this.jsonMapper = new ObjectMapper().setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
this.node = this.jsonMapper.readTree(jsonRawData);
this.resultCode = this.node.get("result").asInt();
return this.isRestResultDone();
}
// サーバーから受信したデータ中の「実行結果コード」を取得する。
public boolean isRestResultDone() {
return 0 == this.resultCode;
}
public boolean isRestResultLessInventory() {
return RestResultCode.REST_RESULT_LESS_INVENBTORY == this.resultCode;
}
public boolean isRestResultLostItem() {
return RestResultCode.REST_RESULT_LOST_ITEM == this.resultCode;
}
// サーバーから受信した商品情報(MyData型オブジェクト配列)を取得する。
public MyData[] getDataAsItemData() throws JsonProcessingException {
MyData[] myData = null;
if(this.isRestResultDone()) { // 正常にデータを受信済み?
String jsonMyData = this.node.get("data").toString();
myData = this.jsonMapper.readValue(jsonMyData, MyData[].class);
}
return myData;
}
// サーバーから受信したデータ中の「エラーメッセージ」を取得する。
public String getRestMessage() {
String msg = "";
if(!this.isRestResultDone()){
msg = this.node.get("message").toString();
}
return msg;
}
}
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2025-12-14: 0回 2025-12-13: 0回 2025-12-12: 2回 2025-12-11: 1回 2025-12-10: 0回 2025-12-09: 0回 2025-12-08: 4回