次の内容の"mapping"
という名前のJsonObject
があります。
{
"client": "127.0.0.1",
"servers": [
"8.8.8.8",
"8.8.4.4",
"156.154.70.1",
"156.154.71.1"
]
}
私は配列"servers"
を取得できることを知っています:
mapping.get("servers").getAsJsonArray()
そして今、そのJsonArray
を解析してJava.util.List
にしたい...
これを行う最も簡単な方法は何ですか?
間違いなく最も簡単な方法は、Gsonのデフォルトの解析関数fromJson()
を使用することです。
ParameterizedType
(たとえば List
)にデシリアライズする必要がある場合に適したこの関数の実装があります。これは fromJson(JsonElement json, Type typeOfT)
です。
あなたの場合は、次のようにList<String>
の Type
を取得し、JSON配列をそのType
に解析するだけです。
import Java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;
JsonElement yourJson = mapping.get("servers");
Type listType = new TypeToken<List<String>>() {}.getType();
List<String> yourList = new Gson().fromJson(yourJson, listType);
あなたの場合、yourJson
は JsonElement
ですが、 String
、任意の Reader
または JsonReader
でも構いません。
Gson APIドキュメント をご覧ください。
以下のコードはcom.google.gson.JsonArray
を使用しています。リストの要素の数とリストの要素の数を印刷しました
import Java.util.ArrayList;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class Test {
static String str = "{ "+
"\"client\":\"127.0.0.1\"," +
"\"servers\":[" +
" \"8.8.8.8\"," +
" \"8.8.4.4\"," +
" \"156.154.70.1\"," +
" \"156.154.71.1\" " +
" ]" +
"}";
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
JsonParser jsonParser = new JsonParser();
JsonObject jo = (JsonObject)jsonParser.parse(str);
JsonArray jsonArr = jo.getAsJsonArray("servers");
//jsonArr.
Gson googleJson = new Gson();
ArrayList jsonObjList = googleJson.fromJson(jsonArr, ArrayList.class);
System.out.println("List size is : "+jsonObjList.size());
System.out.println("List Elements are : "+jsonObjList.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
出力
List size is : 4
List Elements are : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1]
here のGsonの公式ウェブサイトから解決策を読みました
そして、あなたのためのこのコード:
String json = "{"client":"127.0.0.1","servers":["8.8.8.8","8.8.4.4","156.154.70.1","156.154.71.1"]}";
JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class);
JsonArray jsonArray = jsonObject.getAsJsonArray("servers");
String[] arrName = new Gson().fromJson(jsonArray, String[].class);
List<String> lstName = new ArrayList<>();
lstName = Arrays.asList(arrName);
for (String str : lstName) {
System.out.println(str);
}
モニターに表示される結果:
8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1
すべてのフィールドに対して@SerializedName
を使用するだけでリストマッピングを動作させることができました。Type
の周りのロジックは必要ありませんでした。
コードの実行-以下のステップ#4で-デバッガーを介して、List<ContentImage> mGalleryImages
オブジェクトにJSONデータが入力されていることを確認できます
以下に例を示します。
1。JSON
{
"name": "Some House",
"gallery": [
{
"description": "Nice 300sqft. den.jpg",
"photo_url": "image/den.jpg"
},
{
"description": "Floor Plan",
"photo_url": "image/floor_plan.jpg"
}
]
}
2。Java Listのクラス
public class FocusArea {
@SerializedName("name")
private String mName;
@SerializedName("gallery")
private List<ContentImage> mGalleryImages;
}
。Javaリスト項目のクラス
public class ContentImage {
@SerializedName("description")
private String mDescription;
@SerializedName("photo_url")
private String mPhotoUrl;
// getters/setters ..
}
4。JSONを処理するJavaコード
for (String key : focusAreaKeys) {
JsonElement sectionElement = sectionsJsonObject.get(key);
FocusArea focusArea = gson.fromJson(sectionElement, FocusArea.class);
}