2013-08-07 2 views
1

Я пытаюсь сделать запрос «Freebusy» для подключения к API календаря Google. В настоящее время я застрял в форматировании http POST. Я получаю сообщение об ошибке:http POST Formatting Issue - Как массив, список?

{ 
    "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(); 

I верю, что часть, которую я напортачиваю, - это часть "items". Любая помощь будет оценена по достоинству.

ответ

0

Не знаю, правильно ли это относится к java, но в C вы просто подключите другой json к нему, чтобы создать сложный json.

Возможно, этот сайт вам поможет.

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

Edit: я заметил, что форма представляет собой массив объектов ... Так что правильное применение будет так.

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 [] Эти массивы.

EDIT 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); 
+0

Хм, это приближается, это точно. Не 100%, что это будет работать. Я обновил свой вопрос, чтобы упростить свой код, и уточнить, что я делаю. Я буду играть с вашей теорией –

+0

Я отредактировал свое сообщение, чтобы включить материал, который вы должны изменить, также в настройках вашего запроса, и вам нужно включить «Content Length». Я не уверен, что HTTP-запрос java сделает это за вас. GL! – progrenhard

+0

@progenhard: «Не знаю, правильно ли это для java, но в C вы просто подключите другой json к нему, чтобы создать сложный json». json не зависит от языка, поэтому да, это можно сделать независимо от того, какой язык программирования мы используем. – JosephChilberry

0

Что о создании класса, который соответствовал JSON, который вы пытаетесь отправить и положить ArrayList<String> на нем, то вы используете парсер JSON, как Gson и использовать StringEntity для отправки запроса на почту, вот пример:

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> на нем вы могли бы попробовать, в качестве плюса можно было бы использовать HttpURLConnection вместо HttpClient от apache, если вы программируете приложение post-gingerbread вот WHYhttp://android-developers.blogspot.com/2011/09/androids-http-clients.html, надеюсь, что это будет полезно для всех. PD: Я не использовал IDE для кода ниже, извините, если получил ошибки (у меня нет Android Studio @home к моменту, я отформатировал этот код с netbeans: p).

EDIT: просто для уточнения, этот AsyncTask должен быть запущен в потоке пользовательского интерфейса (скажем, в деятельности), как это:

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

EDIT 2: новый код на самом деле работает отлично позвольте мне сказать вам пример из GoogleCalendarJson класса:

GoogleCalendarJson класса (должны иметь геттеры/сеттеры):

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

public GoogleCalendarJson() { 
} 
} 

класса Item (то же самое с г/с):

public class Item { 
private String id; 

public Item() { 
} 
} 

Json Пример Сформирован с Gson:

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

проверить структуру JSon вы можете вставить JSON выше здесь JsonValidator для тестирования этого кода вам нужно активность, которая имеет по крайней мере TextView с идентификатором : result