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

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

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

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

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

1回答

7247閲覧

Java JSONデータから特定のkeyの値を取得したい

nino8752

総合スコア12

JSON

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

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2020/08/21 06:41

Javaを用いてhtmlファイル内の構造化データ(JSON-LD)から@typeキーの値だけ取得したい。
ただし、以下の条件は満たしたいです。

①入れ子になっている@typeは無視したい。
この場合、ListItemは無視したい。

<script type="application/ld+json"> { "@context": "http://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "item":{ "@id": "URL", "name": "TOP" } }, { "@type": "ListItem", "position": 2, "item":{ "@id": "URL", "name":"第二階層" } }, { "@type": "ListItem", "position": 3, "item":{ "@id": "URL", "name": "第三階層" } } ] } </script>

<script>内に複数の構造化データを宣言している場合も考慮して、取得したい。
この場合、LocalBusinessとProductを取得したい。

<script type="application/ld+json"> [ { "@context": "http://schema.org", "@type": "LocalBusiness", "name": "Enazeal株式会社", "telephone": "0800-200-9680", "address": "〒150-0002 東京都渋谷区渋谷1丁目17番2号 ヒューリック渋谷宮下公園ビル 7F(受付)・8F" }, { "@context": "http://schema.org", "@type": "Product", "name": "顔認証万引き防止システムLYKAON", "brand": "LYKAON", "description": "高齢者や要介護者の徘徊対策に。顔認証技術を使った徘徊・無断外出防止システム。", "logo": "http://www.facial-lykaon.com/image/logo.jpg", "url": "http://www.face-lykaon.com/", "image": "http://www.face-lykaon.com/image/jacket.jpg", "manufacturer": "Enazeal株式会社" } ] </script>

試したこと

正規表現で@typeでマッチさせようとしたが①の要件が満たせない。
「,」でsplitして最初に@typeでマッチしたものを取得。②が満たせない。

"@context": "http://schema.org"とマッチしたらその次の要素を取得のような処理ができればある程度要件を満たせるかと思ったのですが方法がわかりません。
ご回答いただけると大変助かります、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Springのタグがついているので、Jacksonの採用には抵抗なしという想定で。
正規表現でがんばるよりも、JSON部分を取り出せるのであれば、あとはJacksonに任せたほうがいいのでは?

MapやListにしてしまえば、あとはいかようにも。

java

1import com.fasterxml.jackson.databind.ObjectMapper; 2import java.util.List; 3import java.util.Map; 4 5public class HogeJson { 6 public static void main(final String[] args) throws Exception { 7 final ObjectMapper objectMapper = new ObjectMapper(); 8 9 final Map<Object, Object> result = objectMapper.readValue(jsonString, Map.class); 10 System.out.println("---- result --------"); 11 System.out.println(result); 12 13 final List<Object> result2 = objectMapper.readValue(jsonString2, List.class); 14 System.out.println("---- result2 --------"); 15 System.out.println(result2); 16 } 17 18 // ---- result -------- 19 // {@context=http://schema.org, @type=BreadcrumbList, itemListElement=[{@type=ListItem, position=1, item={@id=URL, name=TOP}}, {@type=ListItem, position=2, item={@id=URL, name=第二階層}}, {@type=ListItem, position=3, item={@id=URL, name=第三階層}}]} 20 // ---- result2 -------- 21 // [{@context=http://schema.org, @type=LocalBusiness, name=Enazeal株式会社, telephone=0800-200-9680, address=〒150-0002 東京都渋谷区渋谷1丁目17番2号 ヒューリック渋谷宮下公園ビル 7F(受付)・8F}, {@context=http://schema.org, @type=Product, name=顔認証万引き防止システムLYKAON, brand=LYKAON, description=高齢者や要介護者の徘徊対策に。顔認証技術を使った徘徊・無断外出防止システム。, logo=http://www.facial-lykaon.com/image/logo.jpg, url=http://www.face-lykaon.com/, image=http://www.face-lykaon.com/image/jacket.jpg, manufacturer=Enazeal株式会社}] 22 23 24 static final String jsonString = "\n" + 25 "{\n" + 26 " \"@context\": \"http://schema.org\",\n" + 27 " \"@type\": \"BreadcrumbList\",\n" + 28 " \"itemListElement\": \n" + 29 " [\n" + 30 " {\n" + 31 " \"@type\": \"ListItem\",\n" + 32 " \"position\": 1,\n" + 33 " \"item\":{\n" + 34 " \"@id\": \"URL\",\n" + 35 " \"name\": \"TOP\"\n" + 36 " }\n" + 37 " }, {\n" + 38 " \"@type\": \"ListItem\",\n" + 39 " \"position\": 2,\n" + 40 " \"item\":{\n" + 41 " \"@id\": \"URL\",\n" + 42 " \"name\":\"第二階層\"\n" + 43 " }\n" + 44 " }, {\n" + 45 " \"@type\": \"ListItem\",\n" + 46 " \"position\": 3,\n" + 47 " \"item\":{\n" + 48 " \"@id\": \"URL\",\n" + 49 " \"name\": \"第三階層\"\n" + 50 " }\n" + 51 " }\n" + 52 " ]\n" + 53 "}"; 54 55 static final String jsonString2 = "[\n" + 56 " {\n" + 57 " \"@context\": \"http://schema.org\",\n" + 58 " \"@type\": \"LocalBusiness\",\n" + 59 " \"name\": \"Enazeal株式会社\",\n" + 60 " \"telephone\": \"0800-200-9680\",\n" + 61 " \"address\": \"〒150-0002 東京都渋谷区渋谷1丁目17番2号 ヒューリック渋谷宮下公園ビル 7F(受付)・8F\"\n" + 62 " },\n" + 63 " {\n" + 64 " \"@context\": \"http://schema.org\",\n" + 65 " \"@type\": \"Product\",\n" + 66 " \"name\": \"顔認証万引き防止システムLYKAON\",\n" + 67 " \"brand\": \"LYKAON\",\n" + 68 " \"description\": \"高齢者や要介護者の徘徊対策に。顔認証技術を使った徘徊・無断外出防止システム。\",\n" + 69 " \"logo\": \"http://www.facial-lykaon.com/image/logo.jpg\",\n" + 70 " \"url\": \"http://www.face-lykaon.com/\",\n" + 71 " \"image\": \"http://www.face-lykaon.com/image/jacket.jpg\",\n" + 72 " \"manufacturer\": \"Enazeal株式会社\"\n" + 73 " }\n" + 74 "]"; 75}

データのフォーマットが決まっているのであれば、Itemクラスのようなものを定義すると、List/Mapのまま扱うよりも楽ちんかも。

java

1import com.fasterxml.jackson.annotation.JsonProperty; 2import com.fasterxml.jackson.core.type.TypeReference; 3import com.fasterxml.jackson.databind.ObjectMapper; 4import java.util.List; 5 6public class HogeJson2 { 7 8 public static void main(final String[] args) throws Exception { 9 final ObjectMapper objectMapper = new ObjectMapper(); 10 final List<Item> result3 = objectMapper.readValue(jsonString3, new TypeReference<List<Item>>() { 11 }); 12 System.out.println("---- result3 --------"); 13 System.out.println(result3); 14 15 // ---- result3 -------- 16 // [item: <@id:(URL), name:(TOP)>, item: <@id:(URL), name:(第二階層)>, item: <@id:(URL), name:(第三階層)>] 17 } 18 19 public static class Item { 20 @JsonProperty("@id") 21 public String id; 22 public String name; 23 24 @Override 25 public String toString() { 26 return String.format("item: <@id:(%s), name:(%s)>", id, name); 27 } 28 } 29 30 static final String jsonString3 = " [\n" + 31 " {\n" + 32 " \"@id\": \"URL\",\n" + 33 " \"name\": \"TOP\"\n" + 34 " },\n" + 35 " {\n" + 36 " \"@id\": \"URL\",\n" + 37 " \"name\":\"第二階層\"\n" + 38 " },\n" + 39 " {\n" + 40 " \"@id\": \"URL\",\n" + 41 " \"name\": \"第三階層\"\n" + 42 " }\n" + 43 " ]"; 44} 45

投稿2020/08/22 03:11

編集2020/08/22 06:06
shiketa

総合スコア4041

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

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

nino8752

2020/08/22 05:19

ご回答ありがとうございます、Jacksonでの実装を試してみます! (JSONデータの取り扱い経験がなかったので、その発想がなかったです。とても便利ですね、、)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問