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

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

ただいまの
回答率

88.92%

JsonServerからの応答をJsonObjectに入れたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 459

kagemaru

score 12

いつもお世話になっております。
前回から引き続きWebサービスの開発をしております。諸々の問題をここで解決させて頂きありがとうございました。
今回は表題の通り、JsonServerを利用してhttpのテストを行っております。
諸般の事情により相手サーバがテストで使用出来ないため、JsonServerを立ててテストを行おうとしているのですが、サーバ側からの応答をJsonObjectへフォーマットをかけようとして以下のエラーがでてしまい、上手く行きません。
JsonObjectは"{"で始まらなくてはいけないのは理解出来るのですが、実際にJsonServerからのレスポンスが"["で始まっているので上手くフォーマットが出来ません。
どうすれば回避出来るのかご教示頂けないでしょうか。
よろしくお願いいたします。

問題のjavaソース(抜粋)

    try {
      URL url = new URL(pp.getString("AaaURI"));

      con = (HttpURLConnection) url.openConnection();

      con.setDoOutput(true);
      con.setRequestMethod("POST");
      con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
      OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream());
      out.write(hh + hb);
      out.close();
      con.connect();

      // HTTPレスポンスコード
      int status = con.getResponseCode();
      log.setHttpStatusCd(String.valueOf(status));

      InputStream in = con.getInputStream();
      String encoding = con.getContentEncoding();

      if (null == encoding) {
        encoding = "UTF-8";
      }

      InputStreamReader inReader = new InputStreamReader(in, encoding);
      BufferedReader bufReader = new BufferedReader(inReader);

      String line = null;

      while ((line = bufReader.readLine()) != null) {
        // result.append(line);
        // postedDate += DisassembleString.ResultValue(line, "Date");
        if (line != null) {
          rb = line;
        }
      }

      bufReader.close();
      inReader.close();
      in.close();

      JSONObject jsonHttpBody = JSONObject.fromObject(rb);←ここでエラー


db.json

{
  "posts": [
    {
      "id": 1,
      "title": "json-server",
      "author": "typicode"
    },
  ],
  "comments": [
    {
      "id": 1,
      "body": "some comment",
      "postId": 1
    }
  ],
  "profile": {
    "name": "typicode"
  }
}


返って来る値

[ ← これが原因でJsonObjectにいれられない
  {
    "id": 1,
    "title": "json-server",
    "author": "typicode"
  }
]


エラーメッセージ

net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1 of }
    at net.sf.json.util.JSONTokener.syntaxError(JSONTokener.java:499)
    at net.sf.json.JSONObject._fromJSONTokener(JSONObject.java:972)
    at net.sf.json.JSONObject._fromString(JSONObject.java:1201)
    at net.sf.json.JSONObject.fromObject(JSONObject.java:165)
    at net.sf.json.JSONObject.fromObject(JSONObject.java:134)
    at jp.co.aaa.bbb.service.impl.AaaServiceImpl.httpSend(AaaServiceImpl.java:293)
    at jp.co.aaa.bbb.service.impl.AaaServiceImpl.invoke(AaaServiceImpl.java:73)
    at jp.co.aaa.bbb.test.AaaServiceTest.test006(AaaServiceTest.java:160)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
jp.co.aaa.common.ServiceException: net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1 of }
    at jp.co.aaa.bbb.service.impl.AaaServiceImpl.httpSend(RegisterPaymentServiceImpl.java:373)
    at jp.co.aaa.bbb.service.impl.AaaServiceImpl.invoke(RegisterPaymentServiceImpl.java:73)
    at jp.co.aaa.bbb.test.AaaServiceTest.test006(AaaServiceTest.java:160)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1 of }
    at net.sf.json.util.JSONTokener.syntaxError(JSONTokener.java:499)
    at net.sf.json.JSONObject._fromJSONTokener(JSONObject.java:972)
    at net.sf.json.JSONObject._fromString(JSONObject.java:1201)
    at net.sf.json.JSONObject.fromObject(JSONObject.java:165)
    at net.sf.json.JSONObject.fromObject(JSONObject.java:134)
    at jp.co.aaa.bbb.service.impl.AaaServiceImpl.httpSend(AaaServiceImpl.java:293)
    ... 26 more
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

お騒がせしました…単純なコーディングミスでした。

      while ((line = bufReader.readLine()) != null) {
        // result.append(line);
        // postedDate += DisassembleString.ResultValue(line, "Date");
        if (line != null) {
          rb = line; ← 変数rbがStringnなので最後の行だけが残る
        }


正しくは、

      StringBuffer rb = new SrringBuffer();
<中略>
      while ((line = bufReader.readLine()) != null) {
        // result.append(line);
        // postedDate += DisassembleString.ResultValue(line, "Date");
        if (line != null) {
          rb.append(line);
        }
<中略>
      JSONObject jsonHttpBody = JSONObject.fromObject(rb.toString());


上記の様にStringBufferに読込んだJsonを入れていくことで解決出来ました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る