자바와 gson에서 json을 사용할 때 막힌 곳

개시하다


https://qiita.com/advent-calendar/2020/code-polaris
코드폴라리스의 추가 달력에 참가하기 위해 기사를 썼습니다!
자바에서 gson을 사용하여 json을 사용하는 방법은 다른 사이트를 참고했다.
https://joytas.net/programming/webapi
이 사이트는 제이슨 데이터로 별자리 정보를 받는다.
이를 토대로 롯데북스의 API와 imslp의 API를 사용한다.
그나저나 마지막으로 하고 싶은 일은 드푸시가 작곡한 데이터를 imslp의 API로 정리하는 것이다.imslp는 클래식 악보를 다운로드할 수 있는 사이트다.
https://imslp.org/wiki/Main_Page

막힌 곳


참고 사이트에서 사용하다.의 json의 구조와 사용하고 싶은 API의 json의 구조가 다르기 때문에 조금만 고려하지 않으면 안 된다.
사용한 항목만 남아서 많이 절약했다.
기본적으로 참고 사이트의 코드이기 때문에 주요 개작부분(try)만 게재한다.
별 보는 사람 API의 json 데이터
{
	"result": [
		{
			"enName": "Andromeda",
			"jpName": "アンドロメダ座",
			"origin": "エチオペアをケフェウス王とカシオペア王妃が支配していた時のこと、(略)",
			"starImage": "https://livlog.xyz/hoshimiru/img/and.png"
		}
	],
	"status": 0
}

롯데북스 API의 경우


롯데북 API의 json 데이터
나는 장야마유미의 책에서 찾은 결과를 얻을 것이다.
{
	"Items": [
		{
			"Item": {
				"author": "長野 まゆみ",
				"title": "45° ここだけの話",
				"largeImageUrl": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6117/9784065156117.jpg?_ex=200x200",
			}
		}
	]
}
try {
	URL url = new URL(urlString);
	con=(HttpURLConnection) url.openConnection();
	con.setRequestMethod("GET");

	InputStream is = con.getInputStream();
	InputStreamReader isr= new InputStreamReader(is, "UTF-8");
	jReader = new JsonReader(isr);

	JsonObject root = new Gson().fromJson(jReader, JsonObject.class);

	//rootを一番外側のキーにする
	JsonArray result = root.get("Items").getAsJsonArray();

	for (int i = 0; i < result.size(); i++) {
		//bookモデルのインスタンス生成
		Book book = new Book();
		
		//オブジェクトの中のキーを指定しオブジェクトとして取得(入れ子)
		//①
		JsonObject sObj = result.get(i).getAsJsonObject();
		//②
		JsonObject contain = sObj.get("Item").getAsJsonObject();

		//③
		String title = contain.get("title").getAsString();
		String author = contain.get("author").getAsString();
		String imageSrc = contain.get("largeImageUrl").getAsString();

		//bookモデル?にセット
		book.setTitle(title);
		book.setAuthor(author);
		book.setImageSrc(imageSrc);
		list.add(book);
	}
}
먼저 노선에 Items를 설정합니다.
① Items 정렬 - 키가 없는 객체가 많습니다.내가 그걸 먼저 얻었어.
② 그 외에 Item 키가 있는 객체도 있으니 선택하십시오.
③ 원하는 데이터 키를 get에 설정합니다.

imslp 사용 시


sort 속성(?)parent 작곡자 이름(?)의 자모순으로 배열되어 덕표시에서 나온 운모를 start로 한다.저는 끈기가 있어요. 좋은 방법이 있으면 알려주세요.
별 보는 사람 API
imslpAPI의 json 데이터
{
	"0": {
		"id": "Fantasia for 2 Viols (De Pers)",
		"type": "2",
		"parent": "Category:De Pers",
		"intvals": {
			"composer": "De Pers",
			"worktitle": "Fantasia for 2 Viols"
		},
		"permlink": "https:\/\/imslp.org\/wiki\/Fantasia_for_2_Viols_(De_Pers)"
	}
}
try {
	URL url = new URL(urlString);
	con = (HttpURLConnection) url.openConnection();
	con.setRequestMethod("GET");

	InputStream is = con.getInputStream();
	InputStreamReader isr = new InputStreamReader(is, "UTF-8");
	reader = new JsonReader(isr);

	JsonObject root = new Gson().fromJson(reader, JsonObject.class);
	//rootはキーなし
	//連番のキーがついている
	//配列に入っていない
	for (int i = 0; i < root.size()-1; i++) {
		//連番のキーを文字にする
		String key = String.valueOf(i);
		//オブジェクトをとって来る
		JsonObject rootObj = root.get(key).getAsJsonObject();
		Work work = new Work();
		work.setParent(rootObj.get("parent").getAsString());
		work.setUrl(rootObj.get("permlink").getAsString());

		//階層が下(intvalsの中)
		JsonObject lowerObj = rootObj.get("intvals").getAsJsonObject();

		work.setComposer(lowerObj.get("composer").getAsString());
		work.setTitle(lowerObj.get("worktitle").getAsString());
		list.add(work);
	}
}	
루트 열쇠가 없습니다.대상 배열 {}의 데이터는 "0", "1", "2"를 포함합니다.및 숫자 키입니다.
따라서 숫자를 문자로 변환하여 json의 대상으로 꺼냅니다.
또한 invals라는 키의 대상에는 제목 등 데이터가 있어 끼워 넣은 것처럼 데이터를 찾을 수 있다.

완성


이렇게 덕표시의 작품 링크집이 완성되었습니다!
imslp 사이트에도 검색 기능이 있지만 사용하기 어려워 원하는 곡을 조금 쉽게 찾을 수 있다.

이걸 만들면서 제이슨에 대해 조사해봤는데 전혀 이해가 안 돼서 모르는 사이트만큼 이해하기 쉬운 책이 있다면 댓글로 알려주세요.

좋은 웹페이지 즐겨찾기