2017-05-10 15 views
0

Android認定アプリで作業しています。ユーザーがキーワードを入力してアプリを表示できる基本的な検索機能を使用してAPIを使用してアプリにKhan接続を試みています検索基準に合致するトピックや動画や練習問題のリストがありますが、APIでは公式の「キーワードで検索」の方法は提供されていないため、ほとんど不可能です。Khanと協力している人は、トピックツリーは70MBのファイルで終わります。Khan Academyのキーワードで検索

私の頭が苦労して苦労していたのは何日ものことでしたが、これに対処する方法についてはまだ文書がありませんでしたので、私は助けを求めています。誰かがこれに対処する方法や、それを成功させた人には、どの方向にどのようなヒントを与えることができるでしょうか?

私はあなたがhttp://www.khanacademy.org/api/v1/topictree?kind=topic(例えば)を行うことができると知っていますが、このフィルタを使用してもjsonの結果は膨大です(10mb以上のデータストリーム)。

private static String connect2Url(String urlString){ 

     URL url; 
     HttpURLConnection urlConnection = null; 
     InputStream inStream = null; 
     StringBuilder response = new StringBuilder(); 

     try { 
      url = new URL(urlString); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.setDoInput(true); 
      urlConnection.connect(); 
      inStream = urlConnection.getInputStream(); 
      BufferedReader bReader = new BufferedReader(new InputStreamReader(inStream)); 
      String temp = ""; 
      while ((temp = bReader.readLine()) != null) { 
       response.append(temp); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (inStream != null) { 
       try { 
        inStream.close(); 
       } catch (IOException ignored) { 
       } 
      } 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 
     } 

     return response.toString(); 
    } 

そして、私はこの結果をJSONObjectを作成します。

これは、私はJSONをストリーム方法です。

現時点ではURLとして "http://www.khanacademy.org/api/v1/topic/%s"を渡していますが、これではid(topic slug)のみトピックを見つけることができますが、無料で検索することはできません。

[OK]を誰も助けることができ、前もって感謝します。

編集:

私はすでにGSON、ジャクソンについて、そしてもちろん、調査していAlphaQの提案を1として私の解析関数は大きなJSON形式のストリーミングのための効率的ではありませんが、とにかく、私は二つの問題に実行している彼に同意、まず、Khan Academyから返されたjson構造がクラスを作成するのはかなり複雑です(私は思う)。そして、2番目は、より効率的な解析を行うことができたとしても、サーバからKhan Academy jsonの応答をフィルタリングできるとにかく14MBをダウンロードしなければならなくて、Khan Academy APIが提供していないので、私は機能がどれほど最適化されているかにかかわらず、これはまだモバイルアプリにとってあまりにも多いと思う(つまり、フルツリーは70MB)。 "キーワードによる検索"方法。

私はあなたの意見を聞いてください、あなたは14Mbがまだモバイルアプリのためにストリームするにはあまりにも多くのjsonデータだと思いませんか?

これは例として、JSONレスポンスから非常に少ない抜粋です:

{ 
    "icon_src": "", 
    "twitter_url": "", 
    "domain_slug": null, 
    "relative_url": "/", 
    "creation_date": "2016-12-14T00:46:38Z", 
    "web_url": "", 
    "ka_url": "https://www.khanacademy.org/", 
    "translated_standalone_title": "Khan Academy", 
    "has_user_authored_content_types": true, 
    "translated_title": "Khan Academy", 
    "gplus_url": "", 
    "children": [{ 
      "icon_src": "", 
      "twitter_url": "", 
      "domain_slug": "new-and-noteworthy", 
      "relative_url": "/new-and-noteworthy", 
      "creation_date": "2016-09-13T20:35:19Z", 
      "web_url": "", 
      "ka_url": "https://www.khanacademy.org/new-and-noteworthy", 
      "translated_standalone_title": "New and noteworthy", 
      "has_user_authored_content_types": false, 
      "translated_title": "New and noteworthy", 
      "gplus_url": "", 
      "children": [], 
      "hide": false, 
      "node_slug": "new-and-noteworthy", 
      "title": "New and noteworthy", 
      "child_data": [{ 
        "kind": "Video", 
        "id": "1101921746" 
       }, { 
        "kind": "Video", 
        "id": "796509722" 
       }, { 
        "kind": "Video", 
        "id": "796388970" 
       }, { 
        "kind": "Video", 
        "id": "753767269" 
       }, { 
        "kind": "Video", 
        "id": "225139731" 
       }, { 
        "kind": "Video", 
        "id": "225139729" 
       }, { 
        "kind": "Video", 
        "id": "988721865" 
       }, { 
        "kind": "Video", 
        "id": "884313452" 
       }, { 
        "kind": "Video", 
        "id": "671536496" 
       }, { 
        "kind": "Video", 
        "id": "887553535" 
       }, { 
        "kind": "Video", 
        "id": "1049279550" 
       }, { 
        "kind": "Video", 
        "id": "796535894" 
       }, { 
        "kind": "Video", 
        "id": "796307891" 
       }, { 
        "kind": "Video", 
        "id": "1094139389" 
       }, { 
        "kind": "Video", 
        "id": "796502981" 
       }, { 
        "kind": "Video", 
        "id": "796434657" 
       }, { 
        "kind": "Video", 
        "id": "871510490" 
       }, { 
        "kind": "Video", 
        "id": "884392300" 
       }, { 
        "kind": "Video", 
        "id": "x77e83a17" 
       }, { 
        "kind": "Video", 
        "id": "884395195" 
       }, { 
        "kind": "Video", 
        "id": "1077533640" 
       }, { 
        "kind": "Video", 
        "id": "1094227108" 
       }, { 
        "kind": "Video", 
        "id": "1094119956" 
       }, { 
        "kind": "Video", 
        "id": "1112847811" 
       }, { 
        "kind": "Video", 
        "id": "1114711148" 
       }, { 
        "kind": "Video", 
        "id": "1081957510" 
       }, { 
        "kind": "Video", 
        "id": "1095856196" 
       }, { 
        "kind": "Video", 
        "id": "1090948774" 
       }, { 
        "kind": "Video", 
        "id": "1013985489" 
       }, { 
        "kind": "Video", 
        "id": "xca214ba1" 
       } 
      ], 
      "user_authored_content_types_info": [], 
      "id": "x29232c6b", 
      "user_authored_content_types": [], 
      "translated_description": "", 
      "alternate_slugs": [], 
      "standalone_title": "New and noteworthy", 
      "logo_image_url": "", 
      "in_knowledge_map": false, 
      "description": "", 
      "tags": [], 
      "deleted": false, 
      "listed_locales": [], 
      "facebook_url": "", 
      "render_type": "UncuratedTutorial", 
      "background_image_url": "", 
      "background_image_caption": "", 
      "has_peer_reviewed_projects": false, 
      "topic_page_url": "/new-and-noteworthy", 
      "extended_slug": "new-and-noteworthy", 
      "deleted_mod_time": "2013-07-13T00:03:09Z", 
      "kind": "Topic", 
      "curation": {}, 
      "slug": "new-and-noteworthy", 
      "do_not_publish": false, 
      "sha": "a6c251bd225b9d23e1a98f1a7fce3ccd0c8cb4fa", 
      "branding_image_url": "", 
      "current_revision_key": "a6c251bd225b9d23e1a98f1a7fce3ccd0c8cb4fa", 
      "content_id": "x29232c6b", 
      "content_kind": "Topic", 
      "curriculum_key": "" 
     }, { 
      "icon_src": "", 
      "twitter_url": "", 
      "domain_slug": "math", 
      "relative_url": "/math", 
      "creation_date": "2017-05-08T20:15:34Z", 
      "web_url": "", 
      "ka_url": "https://www.khanacademy.org/math", 
      "translated_standalone_title": "Math", 
      "has_user_authored_content_types": false, 
      "translated_title": "Math", 
      "gplus_url": "", 
      "children": [{ 
        "icon_src": "", 
        "twitter_url": "", 
        "domain_slug": "math", 
        "relative_url": "/math/k-8-grades", 
        "creation_date": "2017-03-17T23:26:26Z", 
        "web_url": "", 
        "ka_url": "https://www.khanacademy.org/math/k-8-grades", 
        "translated_standalone_title": "K-8th grades", 
        "has_user_authored_content_types": false, 
        "translated_title": "K-8th grades", 
        "gplus_url": "", 
        "children": [], 
        "hide": false, 
        "node_slug": "k-8-grades", 
        "title": "K-8th grades", 
        "child_data": [], 
        "user_authored_content_types_info": [], 
        "id": "xf3cb93f0", 
        "user_authored_content_types": [], 
        "translated_description": "", 
        "alternate_slugs": [], 
        "standalone_title": "K-8th grades", 
        "logo_image_url": "", 
        "in_knowledge_map": false, 
        "description": "", 
        "tags": [], 
        "deleted": false, 
        "listed_locales": ["fr", "en", "pt", "de", "tr", "pl", "nb", "es"], 
        "facebook_url": "", 
        "render_type": "Subject", 
        "background_image_url": "", 
        "background_image_caption": "", 
        "has_peer_reviewed_projects": false, 
        "topic_page_url": "/math/k-8-grades", 
        "extended_slug": "math/k-8-grades", 
        "deleted_mod_time": null, 
        "kind": "Topic", 
        "curation": { 
         "modules": [{ 
           "content": ["Video:xd2b0fcb4", "Article:x175a9d66", "Video:x102d9798", "Exercise:2015", "Exercise:3022"], 
           "referrer": "k_8_grades_staff_picks", 
           "kind": "ContentCarousel", 
           "title": "Staff picks" 
          }, { 
           "topic": "Topic:xd0ae8a03", 
           "kind": "SubjectIntro" 
          } 
         ], 
         "whitelist": ["Topic:xfe881476a971a3cb", "Topic:xb5feb28c", "Topic:xcef32ab6", "Topic:xef8f4cb4", "Topic:x3184e0ec", "Topic:xc7f617f2", "Topic:x5ec3eb59", "Topic:xb830458a", "Topic:x0267d782", "Topic:x6b17ba59", "Topic:x7c7044d7", "Topic:xa617314f", "Topic:x8708676b", "Topic:x7ed4701d", "Topic:x6ee1f3c2", "Topic:x0f2eb71b", "Topic:xa18e5391"], 
         "hide_community_questions": true 
        }, 

編集2:

私はAlphaQが私を提案し、いくつかの例が、私のJSONレスポンスをチェックアウトするすべてのGSONのマニュアルを読んでいました少し複雑で、マッピングクラスを定義する方法を理解できません。

以下は、私がjsonを取得している場所のURLです。

正しくマッピングするクラスを定義する方法についての助けがあれば幸いです。

http://www.khanacademy.org/api/v1/topictree

(これは任意のフィルタリングなしですが、私は追加することができますか?kind =トピックでトピックの完全なリストを見ることはできますが、それ以上のフィルタは許可されません)

上記は70MBのストリームなので、GSONでも可能ではないと思います。この巨大なファイルからすべての数学のトピックを検索するために、この

http://www.khanacademy.org/api/v1/topic/math

を行います。

jsonが大きすぎると複雑すぎるので、私はこのためのマッピングクラスを作成する方法を理解できません。私は、 "子供"ノードの下にあるトピックのURL、タイトル、説明だけが必要です。

+0

効率的な解析のために、「GSON」や「Jackson」などのJSON解析ライブラリを使用してみてください。 – AlphaQ

+0

こんにちはAlphaQです。このような迅速な対応に感謝します。私の編集画面であなたの回答に関するコメントをご覧ください。 –

+0

jsonを逆シリアル化するクラスを作成する場合は、jsonから抽出するプロパティのみをそこに配置します。 Gsonはそれらのプロパティのみを埋めます。 – nbokmans

答えて

0

私はコメントで言ったようにGSONまたはJacksonを使用することをお勧めします。

ジャクソンでhybrid streaming approachを使用すると、ストリームから必要なデータだけを効率的に解析できます。

ここでは、GSONを使用してexampleです。

ここでGoogleの人は何を言っているかの情報の一部です:何の問題もなく25メガバイト以上の

デシリアライズさの文字列を

詳しい情報hereが。

+0

wOw AlphaQあなたはとても親切です!私は今すぐこれを掘り起こし始めます。私は何か機能があるとすぐにお知らせします。あなたの努力に感謝します。私がこれを続けることができるなら、私はこの答えで解決されたとマークします:) –

+0

確かに、あなたはこれを続けることができます。がんばろう。 – AlphaQ

+0

私はAlphaQを提案したドキュメントを読んでいましたが、まだマッピングクラスの正しい定義を見つけることができないので、少し自由な時間があればIDは私の "Edit 2"を読み、クラスまたはクラスの定義に役立ちます。 。 –

関連する問題