1

Google Calendar API に接続するために「Freebusy」リクエストを作成しようとしています。現在、http POST のフォーマットに固執しています。エラーが発生します:

{
  "error": {
   "errors": [
    {
     "domain": "global",
     "reason": "parseError",
     "message": "Parse Error"
    }
   ],
   "code": 400,
   "message": "Parse Error"
  }
}

リクエストを次のようにフォーマットしようとしています:

{
  "timeMin": datetime,
  "timeMax": datetime,
  "timeZone": string,
  "groupExpansionMax": integer,
  "calendarExpansionMax": integer,
  "items": [
    {
      "id": string
    }
  ]
}

そして現在、これをフォーマットするためにこれを行っています:

String[] stringPairs = new String[]{
            "timeMin",       date1,
            "timeMax",       date2,
            "items[]",       calendarID,
            "timezone",      "Canada/Toronto"};

//Create an HTTP post request
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("HostULR");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(stringPairs.length/2 - 1);

for (int i = 0; i < stringPairs.length; i += 2) {
    nameValuePairs.add(new BasicNameValuePair(stringPairs[i], stringPairs[i+1]));
}

post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
org.apache.http.HttpResponse response = client.execute(post);
HttpEntity entity = response.getEntity();

私が台無しにしている部分はその部分だと思います"items"。どんな助けでも大歓迎です。

4

2 に答える 2

0

これが Java で正しいかどうかはわかりませんが、C では別の json をプラグインして複雑な json を作成します。

多分このウェブサイトはあなたを助けることができます。

https://code.google.com/p/json-simple/wiki/EncodingExamples#Example_1-3_-_Encode_a_JSON_object_-_Using_Map

編集:フォームがオブジェクトの配列であることに気付きました...したがって、正しい実装は次のようになります。

  JSONObject obj=new JSONObject();
  obj.put("ID", string);

  JSONArray list = new JSONArray();

  list.add(obj);

  JSONObject jsonObj = new JSONObject();{
            object.put("timeMin", date1)
            ....

また、私はこのコードについて知りません...

"timezone",      "Canada/Toronto"}, accessToken );

json オブジェクトの場合、一般的に {} は json オブジェクトを表します [] これらは配列です。

編集2:JSONを作成した後、これを行います

StringEntity entity = new StringEntity(json.toString());
                     entity.setContentType("application/json;charset=UTF-8");
                     entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json;charset=UTF-8"));
                     request.setHeader("Accept", "application/json");
                     request.setEntity(entity); 

                     HttpResponse response =null;
                     DefaultHttpClient httpClient = new DefaultHttpClient();

                     HttpConnectionParams.setSoTimeout(httpClient.getParams(), Constants.ANDROID_CONNECTION_TIMEOUT*1000); 
                     HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),Constants.ANDROID_CONNECTION_TIMEOUT*1000); 
                     try{

                     response = httpClient.execute(request); 
                     }
                     catch(SocketException se)
                     {
                         Log.e("SocketException", se+"");
                         throw se;
                     }




InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = reader.readLine()) != null){
    sb.append(line);
于 2013-08-07T17:13:33.060 に答える
0

送信しようとしている json に一致するクラスを作成して、そのArrayList<String>上に を配置し、Gson のようなJsonパーサーを使用しStringEntityて、ポスト リクエストの送信に a を使用するのはどうでしょうか。例を次に示します。

public class JsonTest extends AsyncTask<GoogleCalendarJson, Void, String> {
private HttpClient client;
private HttpPost request;
private HttpResponse response;
private Activity activity;

public JsonTest(Activity a){
    activity = a;
}

@Override
public String doInBackground(GoogleCalendarJson... object){
    client = new DefaultHttpClient();
    request = new HttpPost("YOUR URL HERE");
    StringBuffer b = new StringBuffer("");
    String json = new Gson().toJson(object[0]);
    InputStream is = null;
    BufferedReader br = null;
    try{
        StringEntity se = new StringEntity(json);
        request.setHeader(HTTP.CONTENT_TYPE, "application/json");
        request.setEntity(se);
        response = client.execute(request);
        is = response.getEntity().getContent();
        br = new BufferedReader(new InputStreamReader(is));
        String line = null;
        while(((line = br.readLine()) != null)){
            b.append(line);
        }
        br.close();
    }catch(IOException e){
        b.append(e.getMessage());
    }

    return b.toString();
}
@Override
public void onPostExecute(final String result){
    activity.runOnUiThread(new Runnable(){
        @Override
        public void run(){
            TextView t = (TextView)activity.findViewById(R.id.result);
            t.setText(result);
        }
    });
}
}

configurationであり、plain old java object別のconfigurationオブジェクトへの参照がありconfigurationませArrayList<String>でしArrayList<Item>た。ジンジャーブレッド後のアプリの再プログラミングはhttp://android-developers.blogspot.com/2011/09/androids-http-clients.htmlです。これが誰にとっても役立つことを願っています。PD: 以下のコードには IDE を使用しませんでした。エラーが発生した場合は申し訳ありません (現時点では @home に Android Studio がありません。このコードは netbeans でフォーマットしました :p)。WHY

編集: 明確にするために、この AsyncTask は次のように UI スレッド (たとえばアクティビティ) で実行する必要があります。

JsonTest test = new JsonTest(this); //here we pass the Activity
test.execute(new GoogleCalendarJson()); //this is the object we get in 'object0]'

編集 2: 新しいコードは実際に完全に機能しています。GoogleCalendarJson クラスの例を示します。

GoogleCalendarJson クラス (ゲッター/セッターが必要):

public class GoogleCalendarJson {
private String timeMin, timeMax, timezone;
private int groupExpanxionMaxm, calendarExpansionMax;
private ArrayList<Item> items;

public GoogleCalendarJson() {
}
}

アイテム クラス (g/s と同じ):

public class Item {
private String id;

public Item() {
}
}

Gson で生成された Json の例:

{"timezone":"someTimezone","timeMin":"min","items":
[{"id":"someID"}],"timeMax":"max","groupExpanxionMaxm":2,"calendarExpansionMax":1}

Json 構造を確認するには、上記の json をここに貼り付けることができますJsonValidator このコードをテストするには、少なくとも id を持つ TextView を持つアクティビティが必要です。result

于 2013-08-08T01:22:20.150 に答える