質問編集履歴

1 jsonicを使ってデコードをやってみました

ryo-flat

ryo-flat score 21

2015/12/22 10:32  投稿

javaを使ったWeb上のJsonを取得する方法
Javaを使ってwebページから情報抽出の勉強をしています。webページから情報を取ってきたいのですが、必要な情報がjson形式のため取得できません。htmlのようにパターン抽出などをすることができるのでしょうか。```取得したいwebのソースの一部(http://www.jalan.net/event/130000/)
Javaを使ってwebページから情報抽出の勉強をしています。webページから情報を取ってきたいのですが、必要な情報がjson形式のため取得できません。htmlのようにパターン抽出などをすることができるのでしょうか。現在抜き出したいjsonをソースから抽出し、jsonicを使ってデコードしているのですがうまく変換できません。
```取得したいwebのソースの一部(http://www.jalan.net/event/130000/)
<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(ソースを抜き出し、変換する)
package json;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.arnx.jsonic.JSON;
public class json {
   public static void main(String args[]) throws IOException {
       String title = "";
       URL url = new URL("http://www.jalan.net/event/130000/");
       HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
       InputStream in = httpConn.getInputStream();
       BufferedReader reader = new BufferedReader(new InputStreamReader(in,
               "SHIFT-JIS"));// JISAutoDetect
       StringBuffer lines = new StringBuffer(4096);
       while (true) {
           String line = reader.readLine();
           if (line == null) {
               break;
           }
           lines.append(line);
           lines.append('\n');
       }
       Pattern pattern = Pattern
               .compile("<script type=.*?json.>(.*?)</script>",
                       Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
       Matcher matcher = pattern.matcher(lines.toString());
       while (matcher.find()) {
           title = matcher.group(1);
           System.out.println(title);
       }
       Event event = JSON.decode(title, Event.class);
       System.out.println("name;" + event.getName());
       System.out.println("startDate;" + event.getStartDate());
       System.out.println("endDate:" + event.getEndDate());
       System.out.println("addressLocality:" + event.getAddressLocality());
   }
}
```
```Java(抜き出した値を保持するクラス)
package json;
public class Event {
   String name;
   String startDate;
   String endDate;
   String addressLocality;
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   public String getStartDate() {
       return startDate;
   }
   public void setStartDate(String startDate) {
       this.startDate = startDate;
   }
   public String getEndDate() {
       return endDate;
   }
   public void setEndDate(String endDate) {
       this.endDate = endDate;
   }
   public String getAddressLocality() {
       return addressLocality;
   }
   public void setAddressLocality(String addressLocality) {
       this.addressLocality = addressLocality;
   }
}
```
エラーメッセージ
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
  • Java

    23703 questions

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

  • HTML

    22886 questions

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

  • JSON

    2801 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る