var jsonObject = JSON.parse("{\"key\":\"value\"}"); var jsonArray = JSON.parse("[1,true,\"word\"]"); var jsonString = JSON.stringify({key:"value"});のjavascriptみたいに一行でString ⇄ JsonObject変換したいけど javax.json.JsonのAPIがめんどくさすぎる。特にJsonWriterとか使わない使いたくない場合。
Lazy Man approach
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.company.project.util; | |
import java.io.StringReader; | |
import java.io.StringWriter; | |
import javax.json.Json; | |
import javax.json.JsonObject; | |
import javax.json.JsonReader; | |
import javax.json.JsonWriter; | |
public class JsonUtils { | |
static public String stringify(JsonStructure jsonObjectOrArray) { | |
StringWriter stWriter = new StringWriter(); | |
JsonWriter jsonWriter = Json.createWriter(stWriter); | |
jsonWriter.write(jsonObjectOrArray); | |
jsonWriter.close(); | |
String jsonString = stWriter.toString(); | |
return jsonString; | |
} | |
static public JsonObject parse(String jsonObjectString) { | |
JsonReader jsonReader = Json.createReader(new StringReader(jsonObjectString)); | |
JsonObject jsonObject = jsonReader.readObject(); | |
return jsonObject; | |
} | |
static public JsonArray parseArray(String jsonArrayString) { | |
JsonReader jsonReader = Json.createReader(new StringReader(jsonArrayString)); | |
JsonArray jsonArray = jsonReader.readArray(); | |
return jsonArray; | |
} | |
} |
JsonObject jsonObject = JsonUtils.parse("{\"key\":\"value\"}");
JsonArray jsonArray = JsonUtils.parseArray("[1,true,\"word\"]");
String jsonString = JsonUtils.stringify(jsonObject);
復習
使い方をいつもわすれるので ちょっとメモをJsonObjectやJsonArrayの構築
基本的にJson.createObjectBuilder().xyz.build()
と Json.createArrayBuilder().abc.build()
でオブジェクトやアレーを入れっこ作っていく。xyzとabcとはadd(...)
関数のこと例えば、このようなjsonオブジェクトを組み立てたいとしたら
{
keyString: "String",
keyBoolean: true,
keyArraySimple: [
1,
11,
111
],
keyArrayObject: [{
lang: "ja",
where: "どこ"
},{
lang: "es",
where: "donde"
}],
keyObject: {
git: "svn",
github: "sourceforge"
},
keyNull: null
}
このように書ける
JsonObject json = Json.createObjectBuilder()
.add("keyString", "string")
.add("keyBoolean", true)
.add("keyArraySimple", Json.createArrayBuilder()
.add(1)
.add(11)
.add(111).build())
.add("keyArrayObject", Json.createArrayBuilder()
.add(Json.createObjectBuilder()
.add("lang", "ja")
.add("where", "どこ").build())
.add(Json.createObjectBuilder()
.add("lang", "es")
.add("where", "sourceforge").build()))
.add("keyObject", Json.createObjectBuilder()
.add("git", "svn")
.add("github", "sourceforge").build())
.addNull("keyNull").build();
注意 JsonObject
とJsonArray
はinmutable。mutateできるのはJsonObjectBuilder
やJsonArrayBuilder
の時点までだ。つまり.build()
メソッドの直前まで。
型を調べる
例えばJsonArray
やJsonObject
の中身が固定ではないとき getHogeHoge
してClassCastExceptionをキャッチするより get()
してから getValueType()
を行う方がよさそう.
JsonArray jsonArray = Json.createArrayBuilder()
.add("some string")
.add(true)
.add(1)
.addNull().build();
for (int i = 0; i < jsonArray.size(); ++i) {
JsonValue value = jsonArray.get(i);
switch (value.getValueType()) {
case STRING:
String someString = jsonArray.getString(i);
...
break;
case ARRAY:
boolean positive = jsonArray.getBoolean(i);
...
break;
case NULL:
...
break;
...
default:
...
break;
}
}
HttpServletRequestのbodyをJsonObjectに直接読む
前はJsonReaderやJsonWriterを使いたくないとかぶつぶつ言ったかもしれないけど、やはり使えるならば使った方がよさそう。リクエストのボディをStringにしてからまたJsonObjectにする方がめんどくさい。一発でreaderから直接JsonObjectしよう。書き出しのときは 一旦
String
にしてからじゃないやりかたを今のところ思いつかない。
public class MyServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Only needed when client does not set it properly.
// IMO, Ideally this should not be needed
request.setCharacterEncoding(StandardCharsets.UTF_8.toString());
// リクエストボディを読込
JsonReader bodyJsonReader = Json.createReader(new BufferedReader(request.getReader()));
JsonObject bodyJsonObject = bodyJsonReader.readObject();
...
// リスポンスを返却
String jsonString = JsonUtils.stringify(Json.createObjectBuilder.build());
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
response.setContentType("application/json");
response.getWriter().write(jsonString);
}
}