2013-10-24 9 views
5

Wir machen einige Integration in Richtung einer ziemlich inkonsistent (Zurmo-) REST API. Die API akzeptiert nur urlencodierte Zeichenfolgen als ihre Nutzlast in den HTTP-Posts, antwortet jedoch mit JSON. Da die Dokumentation zu diesem Thema sehr unklar war, dachten wir natürlich, wir könnten JSON dazu schreiben, aber das war nicht der Fall.Bibliothek zum Konvertieren von JSON in urlencodierte

So, jetzt haben wir alle unseren Code zu erzeugen JSON, wenn wir es als x-www-form-urlencoded senden müssen, gibt es eine java Bibliothek, die eine Umwandlung von JSON zu einer urlencoded Zeichenfolge tun kann?

Wir verwenden derzeit die org.json-Lib, aber wir können sie ändern, wenn es nötig wäre.

Beispiel:

Diese JSON-String:

data%5Bdescription%5D=test&data%5BoccurredOnDateTime%5D=2013-10-24+01%3A44%3A50 

Java-Code:

{"data":{"description":"test","occurredOnDateTime":"2013-10-24 01:44:50"}} 

Sollte in diese umgewandelt werden

Wir rasmu übersetzt shaglunds JavaScript-Code zu Java und wickelte es, hier ist das Ergebnis, wenn jemand anderes auf dieses Problem stolpert.

public static String jsonToURLEncoding(JSONObject json) { 
    String output = ""; 
    String[] keys = JSONObject.getNames(json); 
    for (String currKey : keys) 
     output += jsonToURLEncodingAux(json.get(currKey), currKey); 

    return output.substring(0, output.length()-1); 
} 

private static String jsonToURLEncodingAux(Object json, String prefix) { 
    String output = ""; 
    if (json instanceof JSONObject) { 
     JSONObject obj = (JSONObject)json; 
     String[] keys = JSONObject.getNames(obj); 
     for (String currKey : keys) { 
      String subPrefix = prefix + "[" + currKey + "]"; 
      output += jsonToURLEncodingAux(obj.get(currKey), subPrefix); 
     } 
    } else if (json instanceof JSONArray) { 
     JSONArray jsonArr = (JSONArray) json; 
     int arrLen = jsonArr.length(); 

     for (int i = 0; i < arrLen; i++) { 
      String subPrefix = prefix + "[" + i + "]"; 
      Object child = jsonArr.get(i); 
      output += jsonToURLEncodingAux(child, subPrefix); 
     } 
    } else { 
     output = prefix + "=" + json.toString() + "&"; 
    } 

    return output; 
} 

Antwort

4

Wie weiter unten erwähnt, ist es nicht eine Java-Bibliothek, aber Sie sollten es übersetzen Lage sein :)

Hier ist, wie Sie es in Javascript tun könnte:

var jsonArrayToUrl = function (obj, prefix) { 
    var urlString = ""; 
    for (var key in obj) { 
    if (obj[key] !== null && typeof obj[key] == "object") { 
     prefix += "[" + key + "]"; 
     urlString += jsonArrayToUrl(obj[key], prefix); 
    }else{ 
     urlString += prefix + "[" + key + "]=" + obj[key] + "&"; 
    } 
    } 
    return encodeURIComponent(urlString); 
}; 

es dann rufen Sie mit

jsonArrayToUrl(test["data"], "data"); 

Am Beispiel Zeichenfolge, die Sie oben es gab zurück

"data%5Bdescription%5D%3Dtest%26data%5BoccurredOnDateTime%5D%3D2013-10-24%2001%3A44%3A50%26" 

Es sollte rekursiv auf verschachtelten Arrays arbeiten. Sie können auch einen Wrapper für die Funktion schreiben, sodass Sie nur ein Argument benötigen.

+0

Nicht in Java, aber sehr einfach für uns zu übersetzen, danke! – spydon

2
public static String objectToUrlEncodedString(Object object, Gson gson) { 
    return jsonToUrlEncodedString((JsonObject) new JsonParser().parse(gson.toJson(object))); 
} 

private static String jsonToUrlEncodedString(JsonObject jsonObject) { 
    return jsonToUrlEncodedString(jsonObject, ""); 
} 

private static String jsonToUrlEncodedString(JsonObject jsonObject, String prefix) { 
    String urlString = ""; 
    for (Map.Entry<String, JsonElement> item : jsonObject.entrySet()) { 
     if (item.getValue() != null && item.getValue().isJsonObject()) { 
      urlString += jsonToUrlEncodedString(
        item.getValue().getAsJsonObject(), 
        prefix.isEmpty() ? item.getKey() : prefix + "[" + item.getKey() + "]" 
      ); 
     } else { 
      urlString += prefix.isEmpty() ? 
        item.getKey() + "=" + item.getValue().getAsString() + "&" : 
        prefix + "[" + item.getKey() + "]=" + item.getValue().getAsString() + "&"; 
     } 
    } 
    return urlString; 
} 
Verwandte Themen