2013-05-28 2 views
0

Ma chaîne JSON ressemble à ceci:données Parsing JSON avec unicode

"{\"TrackingInformationResponse\": {\u000a \"shipments\": [\u000a {\u000a  \"shipmentId\": \"03015035146308\",\u000a  \"uri\": \"\/ntt-service-rest\/api\/shipment\/03015035146308\/0\",\u000a  \"assessedNumberOfItems\": 1,\u000a  \"deliveryDate\": \"2013-05-13T11:47:00\",\u000a  \"estimatedTimeOfArrival\": \"2013-05-13T16:00:00\",\u000a  \"service\": {\u000a  \"code\": \"88\",\u000a  \"name\": \"DPD\"\u000a  },\u000a  \"consignor\": {\u000a  \"name\": \"Webhallen Danmark ApS\",\u000a  \"address\": {\u000a   \"street1\": \"Elsa Brändströms Gata 52\",\u000a   \"city\": \"HÄGERSTEN\",\u000a   \"countryCode\": \"SWE\",\u000a   \"country\": \"Sverige\",\u000a   \"postCode\": \"12952\"\u000a  }\u000a  },\u000a  \"consignee\": {\u000a  \"name\": \"Lene Bjerre Kontor & IT Service\",\u000a  \"address\": {\u000a   \"street1\": \"Lene Bjerre\",\u000a   \"street2\": \"Ørbækvej 8, Hoven\",\u000a   \"city\": \"TARM\",\u000a   \"countryCode\": \"???\",\u000a   \"postCode\": \"6880\"\u000a  }\u000a  },\u000a  \"statusText\": {\u000a  \"header\": \"Forsendelsen er udleveret\",\u000a  \"body\": \"Forsendelsen blev leveret 13-05-2013 kl. 11:47\"\u000a  },\u000a  \"status\": \"DELIVERED\",\u000a  \"totalWeight\": {\u000a  \"value\": \"0.55\",\u000a  \"unit\": \"kg\"\u000a  },\u000a  \"totalVolume\": {\u000a  \"value\": \"0.005\",\u000a  \"unit\": \"m3\"\u000a  },\u000a  \"items\": [\u000a  {\u000a   \"itemId\": \"03015035146308\",\u000a   \"dropOffDate\": \"2013-05-08T17:18:00\",\u000a   \"deliveryDate\": \"2013-05-13T11:47:00\",\u000a   \"status\": \"DELIVERED\",\u000a   \"statusText\": {\u000a   \"header\": \"Forsendelsen er udleveret til modtageren\",\u000a   \"body\": \"Forsendelsen blev udleveret 13-05-2013 kl. 11:47\"\u000a   },\u000a   \"statedMeasurement\": {\u000a   \"weight\": {\u000a    \"value\": \"0.55\",\u000a    \"unit\": \"kg\"\u000a   },\u000a   \"length\": {\u000a    \"value\": \"0.28\",\u000a    \"unit\": \"m\"\u000a   },\u000a   \"height\": {\u000a    \"value\": \"0.1\",\u000a    \"unit\": \"m\"\u000a   },\u000a   \"width\": {\u000a    \"value\": \"0.2\",\u000a    \"unit\": \"m\"\u000a   },\u000a   \"volume\": {\u000a    \"value\": \"0.005\",\u000a    \"unit\": \"m3\"\u000a   }\u000a   },\u000a   \"events\": [\u000a   {\u000a    \"eventTime\": \"2013-05-08T16:42:00\",\u000a    \"eventCode\": \"68\",\u000a    \"eventDescription\": \"Oplysning om forsendelsen er modtaget\",\u000a    \"location\": {\u000a    \"displayName\": \"Webhallen Danmark ApS\",\u000a    \"name\": \"Webhallen Danmark ApS\",\u000a    \"countryCode\": \"SWE\",\u000a    \"country\": \"Sverige\"\u000a    }\u000a   },\u000a   {\u000a    \"eventTime\": \"2013-05-08T17:18:00\",\u000a    \"eventCode\": \"74\",\u000a    \"eventDescription\": \"Transporten af forsendelsen er påbegyndt\",\u000a    \"location\": {\u000a    \"locationId\": \"126\",\u000a    \"displayName\": \"Segeltorp\",\u000a    \"name\": \"Segeltorp\",\u000a    \"countryCode\": \"SWE\",\u000a    \"country\": \"Sverige\",\u000a    \"postcode\": \"14172\",\u000a    \"city\": \"Segeltorp\",\u000a    \"locationType\": \"HUB\"\u000a    }\u000a   },\u000a   {\u000a    \"eventTime\": \"2013-05-08T17:18:00\",\u000a    \"eventCode\": \"31\",\u000a    \"eventDescription\": \"Forsendelsen er på vej\",\u000a    \"location\": {\u000a    \"locationId\": \"126\",\u000a    \"displayName\": \"Segeltorp\",\u000a    \"name\": \"Segeltorp\",\u000a    \"countryCode\": \"SWE\",\u000a    \"country\": \"Sverige\",\u000a    \"postcode\": \"14172\",\u000a    \"city\": \"Segeltorp\",\u000a    \"locationType\": \"HUB\"\u000a    }\u000a   },\u000a   {\u000a    \"eventTime\": \"2013-05-10T04:34:00\",\u000a    \"eventCode\": \"31\",\u000a    \"eventDescription\": \"Forsendelsen er på vej\",\u000a    \"location\": {\u000a    \"locationId\": \"201\",\u000a    \"displayName\": \"Malmö\",\u000a    \"name\": \"Malmö\",\u000a    \"countryCode\": \"SWE\",\u000a    \"country\": \"Sverige\",\u000a    \"postcode\": \"21241\",\u000a    \"city\": \"Malmö\",\u000a    \"locationType\": \"HUB\"\u000a    }\u000a   },\u000a   {\u000a    \"eventTime\": \"2013-05-10T22:46:13\",\u000a    \"eventCode\": \"31\",\u000a    \"eventDescription\": \"Forsendelsen er på vej\",\u000a    \"location\": {\u000a    \"locationId\": \"0707\",\u000a    \"displayName\": \"Kolding Pakkecenter\",\u000a    \"name\": \"Kolding Pakkecenter\",\u000a    \"countryCode\": \"DNK\",\u000a    \"country\": \"Danmark\",\u000a    \"postcode\": \"2605\",\u000a    \"city\": \"Brøndby\",\u000a    \"locationType\": \"HUB\"\u000a    }\u000a   },\u000a   {\u000a    \"eventTime\": \"2013-05-11T01:05:00\",\u000a    \"eventCode\": \"31\",\u000a    \"eventDescription\": \"Forsendelsen er på vej\",\u000a    \"location\": {\u000a    \"locationId\": \"0050\",\u000a    \"displayName\": \"Kolding\",\u000a    \"name\": \"Kolding\",\u000a    \"countryCode\": \"DNK\",\u000a    \"country\": \"Danmark\",\u000a    \"locationType\": \"DPD_DEPOT\"\u000a    }\u000a   },\u000a   {\u000a    \"eventTime\": \"2013-05-13T07:59:00\",\u000a    \"eventCode\": \"113\",\u000a    \"eventDescription\": \"Forsendelsen gøres klar til levering\",\u000a    \"location\": {\u000a    \"locationId\": \"0506\",\u000a    \"displayName\": \"Herning\",\u000a    \"name\": \"Herning\",\u000a    \"countryCode\": \"DNK\",\u000a    \"country\": \"Danmark\",\u000a    \"locationType\": \"DPD_DEPOT\"\u000a    }\u000a   },\u000a   {\u000a    \"eventTime\": \"2013-05-13T07:59:00\",\u000a    \"eventCode\": \"31\",\u000a    \"eventDescription\": \"Forsendelsen er på vej\",\u000a    \"location\": {\u000a    \"locationId\": \"0506\",\u000a    \"displayName\": \"Herning\",\u000a    \"name\": \"Herning\",\u000a    \"countryCode\": \"DNK\",\u000a    \"country\": \"Danmark\",\u000a    \"locationType\": \"DPD_DEPOT\"\u000a    }\u000a   },\u000a   {\u000a    \"eventTime\": \"2013-05-13T07:59:44\",\u000a    \"eventCode\": \"z65\",\u000a    \"eventDescription\": \"Forsendelsen er ankommet distributionscenter\",\u000a    \"location\": {\u000a    \"locationId\": \"6900\",\u000a    \"displayName\": \"Skjern\",\u000a    \"name\": \"Skjern Distributionscenter\",\u000a    \"countryCode\": \"DNK\",\u000a    \"country\": \"Danmark\",\u000a    \"postcode\": \"6900\",\u000a    \"city\": \"Skjern\",\u000a    \"locationType\": \"DEPOT\"\u000a    }\u000a   },\u000a   {\u000a    \"eventTime\": \"2013-05-13T11:47:00\",\u000a    \"eventCode\": \"21\",\u000a    \"eventDescription\": \"Forsendelsen er udleveret\",\u000a    \"location\": {\u000a    \"locationId\": \"0506\",\u000a    \"displayName\": \"Herning\",\u000a    \"name\": \"Herning\",\u000a    \"countryCode\": \"DNK\",\u000a    \"country\": \"Danmark\",\u000a    \"locationType\": \"DPD_DEPOT\"\u000a    }\u000a   }\u000a   ],\u000a   \"references\": [\u000a   {\u000a    \"value\": \"5008074\",\u000a    \"type\": \"CU\",\u000a    \"name\": \"Afsenderreference \"\u000a   }\u000a   ]\u000a  }\u000a  ],\u000a  \"additionalServices\": [\u000a  ],\u000a  \"splitStatuses\": [\u000a  ],\u000a  \"shipmentReferences\": [\u000a  {\u000a   \"value\": \"5008074\",\u000a   \"type\": \"CU\",\u000a   \"name\": \"Afsenderreference \"\u000a  }\u000a  ]\u000a }\u000a ]\u000a}}" 

Je reçois ces données à partir d'un serveur en utilisant le code suivant:

public String readJSONFeed(String URL) { 
    StringBuilder stringBuilder = new StringBuilder(); 
    HttpClient httpClient = new DefaultHttpClient(); 
    HttpGet httpGet = new HttpGet(URL); 
    try { 
     HttpResponse response = httpClient.execute(httpGet); 
     StatusLine statusLine = response.getStatusLine(); 
     int statusCode = statusLine.getStatusCode(); 
     if (statusCode == 200) { 
      HttpEntity entity = response.getEntity(); 
      InputStream inputStream = entity.getContent(); 
      BufferedReader reader = new BufferedReader(
        new InputStreamReader(inputStream, "UTF-8")); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       stringBuilder.append(line); 
      } 
      inputStream.close(); 
     } else { 
      Log.d("JSON", "Failed to download file"); 
     } 
    } catch (Exception e) { 
     Log.d("readJSONFeed", e.getLocalizedMessage()); 
    }   
    return stringBuilder.toString(); 
} 

Lorsque je tente d'analyser la chaîne avec

JSONObject jsonObject = new JSONObject(result); 

, j'obtiens une exception, probablement parce que le JSON n'est pas valide. Si je tente de remplacer manuellement les caractères unicode comme celui-ci, il fonctionne parfaitement:

  • \ u000a est remplacée par une nouvelle ligne
  • \ » est remplacé par juste «
  • premier et dernier » est retiré

Comment pourrais-je aller sur l'analyse de ces données?

+0

Je pense que cela pourrait vous aider à: http://stackoverflow.com/questions/3537706/howto-unescape-a- java-string-literal-in-java/4298836 # 4298836 – reidzeibel

Répondre

0
"{\"TrackingInformationResponse\": {\u000a \"shipments\": [\u000a... 

Vous avez une chaîne JSON qui est lui-même wr apped dans un format littéral de chaîne. Il n'est pas sûr à 100% quel est le format de la chaîne d'emballage parce qu'il existe de nombreux formats qui utilisent \u et \" échappements - vous devriez obtenir toute la documentation possible sur le service que vous appelez pour essayer de comprendre ce qu'il est censé être. Il semblerait étrange et inutile d'encapsuler un résultat de retour de service Web dans un format littéral de chaîne comme celui-ci.

Une possibilité est littérale de chaîne Java; dans ce cas, voir unescapeJava dans StringEscapeUtils d'Apache.

Cependant probablement le plus probable serait JSON chaîne littérale - c'est-à-dire double-JSON-encoding. Dans ce cas, vous devrez décoder la chaîne JSON une fois avant de regarder la structure JSON imbriquée à l'intérieur.

En supposant que vous utilisez org.json, cependant, il n'y a pas un analyseur direct JSONString pour aller avec les parseurs JSONObject et JSONArray. Cependant, vous pouvez toujours envelopper votre chaîne dans une structure de ceux comprendront, par exemple:

String unwrapped= new JSONArray("["+result+"]").get(0); 
JSONObject o= new JSONObject(unwrapped); 
+0

Je ne trouve aucune information sur les données elles-mêmes. Serait-il possible de remplacer manuellement tous les \ u000a par de nouvelles lignes, etc.? – Lazze

+0

@Lazze: peu probable - il peut y avoir des caractères spéciaux autres que '\ u000A' que vous n'avez pas dans votre exemple. Je m'attendrais à voir un backslash réel encodé comme double-backslash, par exemple. Et vous avez '\ /' dedans pour la barre oblique qui est un casse-tête car ni les formats littéraux Java ni JSON ne requièrent cet échappement (bien que les deux le permettent). Je voudrais aller avec un décodeur JSON jusqu'à ce que vous pouvez obtenir une réponse définitive du fournisseur du service auquel vous vous connectez. – bobince