/**
*
* リモートサーバーからJSONを取得するsample
*/
@Service
@Slf4j
public class JsonService {
public static final String JSON_URL ="https://sample.com/out.json";
//JsonデータPost先URL
public static final String PATH="http://localhost:8080/rest/json";
public void readJsonStr() {
readOutJson(JSON_URL);
}
//Rest送信コール
// JSONデータ(Info.java→info.json)をRestを利用し、リクエストBodyにセットして送信し、
// WebAPIから返却されるJsonデータを取得して、Javaのオブジェクトへ変換する。
public void postJsonData() throws Exception{
readForPostJson(PATH);
}
public void readForPostJson(String urlPath) throws Exception{
URI uri=new URI(urlPath);
URL url=uri.toURL();
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//POSTに指定
connection.setRequestMethod("POST");
//POST出力可能
connection.setDoOutput(true);
//コネクション上でレスポンスデータ受信の許可
connection.setDoInput(true);
//cache無し
connection.setUseCaches(false);
// データタイプをjsonに指定する
connection.setRequestProperty("Content-Type","application/json; charset=utf-8");
//connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// ---------------------
// 接続を確率
// ---------------------
connection.connect();
// JSONデータを出力ストリームへ書き出すデータ
Info info=new Info();
ObjectMapper mapper=new ObjectMapper();
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
String strJson=mapper.writeValueAsString(info);
PrintStream printStream=new PrintStream(connection.getOutputStream());
printStream.print(strJson);
printStream.close();
// jsonデータを出力ストリームへ書き出す
/*
BufferedWriter writer
=new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(),"UTF-8"));
writer.write(strJson);
writer.close();
*/
// レスポンスコードを取得する。
int responseCode=connection.getResponseCode();
log.info("responseCode =" +responseCode);
// 接続が正常かステータスコードを取得する。
if(HttpURLConnection.HTTP_OK==responseCode) {
// JSONテキストを取得する。
//StringBuffer stringBuffer=new StringBuffer();
// JSONデータ取得
InputStream inputStream=connection.getInputStream();
processLargeJson(inputStream);
}
}
/**
* リモートサーバーにあるJSONファイルからJSON文字列を取得する。
* @param urlPath リモートサーバーのJSONファイルパス
* @return
*/
public void readOutJson(String urlPath) {
try {
URI uri=new URI(urlPath);
URL url=uri.toURL();
// 接続オブジェクトを取得する。
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
// リクエストメソッドを取得
connection.setRequestMethod("GET");
// 通信開始
connection.connect();
// レスポンスコードを取得する。
int responseCode=connection.getResponseCode();
// 接続が正常かステータスコードを取得する。
if(HttpURLConnection.HTTP_OK==responseCode) {
// エンコード取得
String encoding=connection.getContentEncoding();
if(null==encoding) {
encoding="UTF-8";
}
// JSONデータ取得
InputStream inputStream=connection.getInputStream();
/*********************************
try(
InputStream inputStream=connection.getInputStream();
InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
BufferedReader bufferedReader=new BufferedReader(inputStreamReader);){
String line=null;
StringBuilder stringBuffer=new StringBuilder();
while((line=bufferedReader.readLine())!=null) {
stringBuffer.append(line);
}
System.out.println(stringBuffer.toString());
//取得した文字列を返す
//return stringBuffer.toString();
}catch (Exception e) {
log.error("JSON取得処理に失敗しました。");
e.printStackTrace();
}
/***********************************/
processLargeJson(inputStream);
}
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void processLargeJson(InputStream inputStream) throws IOException{
JsonFactory jsonFactory=new JsonFactory();
// JSON解析オブジェクト生成
//JsonParser jsonParser=jsonFactory.createParser(new BufferedInputStream(inputStream, 2048));
// -----------------------------------------------------------------
// InputStreamの利点が入力を少しずつ読み取ることができるという理由で、
// JSON全体をメモリにプルしても問題ないことを前提としています.
// https://stackoverflow.com/questions/6511880/how-to-parse-a-json-input-stream
// -----------------------------------------------------------------
JsonParser jsonParser=jsonFactory.createParser(inputStream);
// --------------------------
// トークンストリームの処理
// ---------------------------
// -- info を取得する。--
int cnt=0;
while (jsonParser.nextToken()!=JsonToken.END_OBJECT) {
String fieldName=jsonParser.currentName();
log.info("fieldName="+fieldName);
// infoの内容を取得する。
if("info".equals(fieldName)) {
processFieldElement(jsonParser);
}
// dataの内容を取得する。
if("data".equals(fieldName)) {
processResultFieldElement(jsonParser);
}
}
inputStream.close();
jsonParser.close();
System.out.println("END");
}
/**
* infoのデータを取得する。
* @param jsonParser
* @throws IOException
*/
public void processFieldElement(JsonParser jsonParser) throws IOException{
JsonToken jsonToken=jsonParser.nextToken();
if(jsonToken==JsonToken.START_OBJECT) {
ObjectMapper mapper=new ObjectMapper();
JsonNode node=mapper.readTree(jsonParser);
String strInfoNde=mapper.writeValueAsString(node);
System.out.println("strInfoNde="+strInfoNde);
}
}
/**
* dataのデータを取得する。
* @param jsonParser
* @throws IOException
*/
public void processResultFieldElement(JsonParser jsonParser) throws IOException{
JsonToken jsonToken=jsonParser.nextToken();
if(jsonToken==JsonToken.START_OBJECT) {
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonParser);
String dayTimeJson=mapper.writeValueAsString(node);
System.out.println("strNode="+dayTimeJson);
TypeReference<Map<String,List<String[]>>> typeRef
=new TypeReference<Map<String,List<String[]>>>() {};
Map<String,List<String[]>> mapData=mapper.readValue(dayTimeJson, typeRef);
// Mapデータの中身を表示する。
Set<String> keys= mapData.keySet();
Iterator<String> itr=keys.iterator();
while(itr.hasNext()) {
String setsubiCode=itr.next();
List<String[]> dataList=mapData.get(setsubiCode);
for(int i=0;i<dataList.size();i++) {
String[] data=dataList.get(i);
for(int j=0;j<data.length;j++) {
String str=data[i];
System.out.print(str+" ");
}
System.out.println();
}
}
System.out.println("TEST");
}
}
}