2013-03-02 3 views
1

Я хочу общаться с веб-сервером и обмениваться информацией JSON.Отправка комплекса JSON Object

мой вебсервис URL выглядит как следующий формат: http://46.157.263.140/EngineTestingWCF/DPMobileBookingService.svc/SearchOnlyCus

Вот мой формат JSON запроса.

{ 
    "f": { 
     "Adults": 1, 
     "CabinClass": 0, 
     "ChildAge": [ 
      7 
     ], 
     "Children": 1, 
     "CustomerId": 0, 
     "CustomerType": 0, 
     "CustomerUserId": 81, 
     "DepartureDate": "/Date(1358965800000+0530)/", 
     "DepartureDateGap": 0, 
     "Infants": 1, 
     "IsPackageUpsell": false, 
     "JourneyType": 2, 
     "PreferredCurrency": "INR", 
     "ReturnDate": "/Date(1359138600000+0530)/", 
     "ReturnDateGap": 0, 
     "SearchOption": 1 
    }, 
    "fsc": "0" 
} 

Я попытался с помощью следующего кода, чтобы послать запрос:

public class Fdetails { 
    private String Adults = "1"; 
    private String CabinClass = "0"; 
    private String[] ChildAge = { "7" }; 
    private String Children = "1"; 
    private String CustomerId = "0"; 
    private String CustomerType = "0"; 
    private String CustomerUserId = "0"; 
    private Date DepartureDate = new Date(); 
    private String DepartureDateGap = "0"; 
    private String Infants = "1"; 
    private String IsPackageUpsell = "false"; 
    private String JourneyType = "1"; 
    private String PreferredCurrency = "MYR"; 
    private String ReturnDate = ""; 
    private String ReturnDateGap = "0"; 
    private String SearchOption = "1"; 
} 

public class Fpack { 
    private Fdetails f = new Fdetails(); 
    private String fsc = "0"; 
} 

Затем с помощью Gson создать объект JSON как:

public static String getJSONString(String url) { 
String jsonResponse = null; 
String jsonReq = null; 
Fpack fReq = new Fpack(); 

try {             
    Gson gson = new Gson(); 
    jsonReq = gson.toJson(fReq);       
    JSONObject json = new JSONObject(jsonReq); 
    JSONObject jsonObjRecv = HttpClient.SendHttpPost(url, json); 
    jsonResponse = jsonObjRecv.toString(); 
} 
catch (JSONException e) { 
          e.printStackTrace(); 
       }    
return jsonResponse; 
    } 

и мой HttpClient.SendHttpPost метод

public static JSONObject SendHttpPost(String URL, JSONObject json) { 

     try { 
      DefaultHttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httpPostRequest = new HttpPost(URL); 

      StringEntity se; 
      se = new StringEntity(json.toString()); 
      httpPostRequest.setEntity(se); 
      se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));   
      HttpResponse response = (HttpResponse) httpclient.execute(httpPostRequest); 
      HttpEntity entity = response.getEntity(); 
      if (entity != null) { 
       // Read the content stream 
       InputStream instream = entity.getContent(); 
       Header contentEncoding = response.getFirstHeader("Content-Encoding"); 
       if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) { 
        instream = new GZIPInputStream(instream); 
       } 

       // convert content stream to a String 
       String resultString= convertStreamToString(instream); 
       instream.close(); 
       resultString = resultString.substring(1,resultString.length()-1); // remove wrapping "[" and "]" 

       // Transform the String into a JSONObject 
       JSONObject jsonObjRecv = new JSONObject(resultString); 
      return jsonObjRecv; 
      } 
    catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

Теперь я получаю следующее исключение:

org.json.JSONException: Value !DOCTYPE of type java.lang.String cannot be converted to JSONObject 
at org.json.JSON.typeMismatch(JSON.java:111) 
at org.json.JSONObject.<init>(JSONObject.java:158) 
at org.json.JSONObject.<init>(JSONObject.java:171) 

и распечатку строки JSON прямо перед тем, как сделать запрос следующим образом:

{ 
    "f": { 
     "PreferredCurrency": "MYR", 
     "ReturnDate": "",    
     "ChildAge": [ 
      7 
     ], 
     "DepartureDate": "Mar 2, 2013 1:17:06 PM", 
     "CustomerUserId": 0, 
     "CustomerType": 0, 
     "CustomerId": 0, 
     "Children": 1, 
     "DepartureDateGap": 0, 
     "Infants": 1, 
     "IsPackageUpsell": false, 
     "JourneyType": 1, 
     "CabinClass": 0, 
     "Adults": 1, 
     "ReturnDateGap": 0, 
     "SearchOption": 1 

    }, 
    "fsc": "0" 
} 

Как решить это исключение? Заранее спасибо!

ответ

0

На самом деле это был НЕОБХОДИМЫЙ ЗАПРОС. То почему сервер возвращает ответ как формат XML. Проблема заключается в том, чтобы преобразовать примитивные данные не являющихся (дата) для объекта JSON .. так что будет Bad Request .. Я решил сам разобраться в GSON адаптерами .. Вот код, который я использовал:

try {              
         JsonSerializer<Date> ser = new JsonSerializer<Date>() { 

          @Override 
          public JsonElement serialize(Date src, Type typeOfSrc, 
            JsonSerializationContext comtext) { 

           return src == null ? null : new JsonPrimitive("/Date("+src.getTime()+"+05300)/"); 
          } 
         }; 
         JsonDeserializer<Date> deser = new JsonDeserializer<Date>() {       
          @Override 
          public Date deserialize(JsonElement json, Type typeOfT, 
            JsonDeserializationContext jsonContext) throws JsonParseException { 

           String tmpDate = json.getAsString(); 

            Pattern pattern = Pattern.compile("\\d+"); 
            Matcher matcher = pattern.matcher(tmpDate); 
            boolean found = false; 

            while (matcher.find() && !found) { 
             found = true; 
             tmpDate = matcher.group(); 
            } 
           return json == null ? null : new Date(Long.parseLong(tmpDate));        
          } 
         }; 
3

Я не очень хорошо знаком с Json, но я знаю, что он довольно часто используется сегодня, и ваш код кажется без проблем.

Как преобразовать эту строку JSON в объект JSON?

Ну, вы почти попасть туда, просто отправить строку JSON на сервер, и снова использовать Gson на сервере:

Gson gson = new Gson(); 
Fpack f = gson.fromJSON(json, Fpack.class); 

http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html

О Exception:

Вы должны удалить эту строку, потому что вы отправляете запрос, а не отвечаете на один:

httpPostRequest.setHeader("Accept", "application/json"); 

И я меняю бы эту линию:

httpPostRequest.setHeader("Content-type", "application/json"); 

к

se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 

Если это не делает никакой разницы, пожалуйста, распечатайте вашу строку JSON, прежде чем отправить запрос, давайте посмотрим что там.

+0

Спасибо за Ваш ответ. но когда я отправляю строку json на свой сервер, я получил это предупреждение 'org.json.JSONException: Value bCliks

+0

@bala Как вы отправляете эту строку? Вы получили исключение на стороне сервера или на стороне клиента? – MrROY

+0

// Вы получили исключение на стороне сервера или на стороне клиента? // Я получил это исключение на стороне клиента. // Как вы отправляете эту строку? // Я обновляю свой вопрос об этом .. см. .. и помогите мне .. – bCliks

3

Чтобы создать запрос с объектом JSON прилагается к нему, что вы должны сделать, это следующее:

public static String sendComment (String commentString, int taskId, String sessionId, int displayType, String url) throws Exception 
{ 
    Map<String, Object> jsonValues = new HashMap<String, Object>(); 
    jsonValues.put("sessionID", sessionId); 
    jsonValues.put("NewTaskComment", commentString); 
    jsonValues.put("TaskID" , taskId); 
    jsonValues.put("DisplayType" , displayType); 
    JSONObject json = new JSONObject(jsonValues); 

    DefaultHttpClient client = new DefaultHttpClient(); 

    HttpPost post = new HttpPost(url + SEND_COMMENT_ACTION); 

    AbstractHttpEntity entity = new ByteArrayEntity(json.toString().getBytes("UTF8")); 
    entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
    post.setEntity(entity); 
    HttpResponse response = client.execute(post); 

    return getContent(response);  
} 
+0

Simple & Clean +1 –

+1

Это сработало для меня, вместо того, чтобы использовать 'StringEntity'. +1. –

0

Из того, что я понял, вы хотите сделать запрос на сервер с помощью JSON, который вы создали, вы можете сделать что-то вроде этого:

URL url; 
    HttpURLConnection connection = null; 
    String urlParameters ="json="+ jsonSend; 
    try { 
     url = new URL(targetURL); 
     connection = (HttpURLConnection)url.openConnection(); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Content-Type", 
      "application/x-www-form-urlencoded"); 
     connection.setRequestProperty("Content-Language", "en-US"); 
     DataOutputStream wr = new DataOutputStream (
        connection.getOutputStream()); 
     wr.writeBytes (urlParameters); 
     wr.flush(); 
     wr.close(); 

     InputStream is = connection.getInputStream(); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
     String line; 
     StringBuffer response = new StringBuffer(); 
     while((line = rd.readLine()) != null) { 
     response.append(line); 
     response.append('\r'); 
     } 
     rd.close(); 
     return response.toString(); 

    } catch (Exception e) { 

     e.printStackTrace(); 
     return null; 

    } finally { 

     if(connection != null) { 
     connection.disconnect(); 
     } 
    } 
    } 
Смежные вопросы