質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

5回答

10273閲覧

javaを使ったWeb上のJsonを取得する方法

ryo-flat

総合スコア21

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2015/12/21 05:01

編集2015/12/22 01:32

Javaを使ってwebページから情報抽出の勉強をしています。webページから情報を取ってきたいのですが、必要な情報がjson形式のため取得できません。htmlのようにパターン抽出などをすることができるのでしょうか。現在抜き出したいjsonをソースから抽出し、jsonicを使ってデコードしているのですがうまく変換できません。

<script type="application/ld+json"> [ { "@context" : "http://schema.org", "@type" : "Event", "name" : "LINE Presents 表参道イルミネーション2015", "startDate" : "2015-12-01", "endDate" : "2015-12-25", "location" : { "@type" : "Place", "address" : { "@type" : "PostalAddress", "addressLocality" : "神宮前", "addressRegion" : "東京" } },

java(ソースを抜き出し、変換する)

1package json; 2import java.io.BufferedReader; 3import java.io.IOException; 4import java.io.InputStream; 5import java.io.InputStreamReader; 6import java.net.HttpURLConnection; 7import java.net.URL; 8import java.util.regex.Matcher; 9import java.util.regex.Pattern; 10 11import net.arnx.jsonic.JSON; 12 13public class json { 14 15 public static void main(String args[]) throws IOException { 16 String title = ""; 17 URL url = new URL("http://www.jalan.net/event/130000/"); 18 HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); 19 InputStream in = httpConn.getInputStream(); 20 BufferedReader reader = new BufferedReader(new InputStreamReader(in, 21 "SHIFT-JIS"));// JISAutoDetect 22 StringBuffer lines = new StringBuffer(4096); 23 while (true) { 24 String line = reader.readLine(); 25 if (line == null) { 26 break; 27 } 28 lines.append(line); 29 lines.append('\n'); 30 } 31 Pattern pattern = Pattern 32 .compile("<script type=.*?json.>(.*?)</script>", 33 Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 34 Matcher matcher = pattern.matcher(lines.toString()); 35 while (matcher.find()) { 36 title = matcher.group(1); 37 System.out.println(title); 38 } 39 Event event = JSON.decode(title, Event.class); 40 System.out.println("name;" + event.getName()); 41 System.out.println("startDate;" + event.getStartDate()); 42 System.out.println("endDate:" + event.getEndDate()); 43 System.out.println("addressLocality:" + event.getAddressLocality()); 44 } 45}

Java(抜き出した値を保持するクラス)

1package json; 2 3public class Event { 4 5 String name; 6 String startDate; 7 String endDate; 8 String addressLocality; 9 10 public String getName() { 11 return name; 12 } 13 public void setName(String name) { 14 this.name = name; 15 } 16 public String getStartDate() { 17 return startDate; 18 } 19 public void setStartDate(String startDate) { 20 this.startDate = startDate; 21 } 22 public String getEndDate() { 23 return endDate; 24 } 25 public void setEndDate(String endDate) { 26 this.endDate = endDate; 27 } 28 public String getAddressLocality() { 29 return addressLocality; 30 } 31 public void setAddressLocality(String addressLocality) { 32 this.addressLocality = addressLocality; 33 } 34 35} 36

エラーメッセージ
Exception in thread "main" net.arnx.jsonic.JSONException: [{@context=http://schema.org, @type=Event, name=LINE Presents 表参道イルミネーション2015, startDate=2015-12-01, endDate=2015-12-25, location={@type=Place, address={@type=PostalAddress, addressLocality=神宮前, addressRegion=東京}}, image=http://www.jalan.net/jalan/img/6/event/0176/KXL/e17658...... は class json.Event に変換できませんでした: $
at net.arnx.jsonic.JSON$Context.convertInternal(JSON.java:1775)
at net.arnx.jsonic.JSON.parse(JSON.java:1155)
at net.arnx.jsonic.JSON.parse(JSON.java:1130)
at net.arnx.jsonic.JSON.decode(JSON.java:665)
at json.json.main(json.java:39)
Caused by: java.lang.UnsupportedOperationException: Cannot convert class java.util.ArrayList to class json.Event
at net.arnx.jsonic.ObjectConverter.convert(Converter.java:1655)
at net.arnx.jsonic.JSON.postparse(JSON.java:1310)
at net.arnx.jsonic.JSON$Context.convertInternal(JSON.java:1762)
... 4 more

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

java

1for (int i = 0; i < event.length; i++) { 2 3 ... 4 5 System.out.println("addressLocality:" + event[i].getLocation().getAddress().getAddressLocality()); 6 7 ... 8 9}

ですね。

投稿2015/12/24 01:30

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryo-flat

2015/12/24 01:45

最後までお付き合いいただきありがとうございます。 jsonのパースの仕方を知ることができました。
hyper-drums-ko

2015/12/24 01:47

お役に立てたようでよかったです。 頑張ってください!
guest

0

POJO を JSON と同じレイアウトにする必要があります。

json

1"location" : { 2 "@type" : "Place", 3 "address" : { 4 "@type" : "PostalAddress", 5 "addressLocality" : "神宮前", 6 "addressRegion" : "東京" 7 } 8}

ですので

Event.java

Java

1package json; 2 3public class Event { 4 5 private String name; 6 private String startDate; 7 private String endDate; 8 private Location location; 9 10 public String getName() { 11 return name; 12 } 13 public void setName(String name) { 14 this.name = name; 15 } 16 public String getStartDate() { 17 return startDate; 18 } 19 public void setStartDate(String startDate) { 20 this.startDate = startDate; 21 } 22 public String getEndDate() { 23 return endDate; 24 } 25 public void setEndDate(String endDate) { 26 this.endDate = endDate; 27 } 28 public Location getLocation() { 29 return location; 30 } 31 public void setLocation(Location location) { 32 this.location = location; 33 } 34 35}

Location.java

Java

1package json; 2 3public class Location { 4 5 private Address address; 6 7 public Address getAddress() { 8 return address; 9 } 10 public void setAddress(Address address) { 11 this.address = address; 12 } 13 14}

Address.java

Java

1package json; 2 3public class Address { 4 5 private String addressLocality; 6 private String addressRegion; 7 8 public String getAddressLocality() { 9 return addressLocality; 10 } 11 public void setAddressLocality(String addressLocality) { 12 this.addressLocality = addressLocality; 13 } 14 public String getAddressRegion() { 15 return addressRegion; 16 } 17 public void setAddressRegion(String addressRegion) { 18 this.addressRegion = addressRegion; 19 } 20 21}

ですかね。

投稿2015/12/22 05:19

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryo-flat

2015/12/23 02:01

同じ構造にしなければいけないんですね。 この場合addressLocalityをgetするにはどれを使えばいいんでしょうか。 System.out.println("addressLocality:" + この部分);
guest

0

JSONは配列で返却されているようですので

Java

1Event[] event = JSON.decode(title, Event[].class);

でいかがでしょうか?

投稿2015/12/22 02:14

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryo-flat

2015/12/22 02:26

nameとstartDatetとendDateは抜き出せました。 なぜかaddressLocalityが抜き出せません。
guest

0

htmlのパターン抽出の要領でソースを取得し

そうですね。

Java

1String jsonString = null; 2Matcher m = Pattern.compile("<script type=\"application/ld\\+json\">(.+?)</script>").matcher(*取得したページのHTML*); 3if (m.find()) { 4 jsonString = m.group(1); 5}

こんな感じで抜きだせるかと。

投稿2015/12/21 06:47

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryo-flat

2015/12/22 01:33

ソースは抜き出せたのですが、上記のエラーが出ました。
guest

0

JSONIC や Jackson といったライブラリを使用し、一旦パースしてから使用するのはいかがでしょうか。

JSONIC - simple json encoder/decoder for java

投稿2015/12/21 05:11

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryo-flat

2015/12/21 05:18

解答ありがとうございます。 htmlのパターン抽出の要領でソースを取得し、パースするということでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問