2013-03-22 54 views
0

我耗費了JSON網絡的API,將所有&」,」,<和>,在數據字符&放;, & QUOT;等它看起來像它的使用PHP的用htmlspecialchars()。使用Play修正htmlspecialchars() - JSON負載內的編碼數據!和傑克遜

我有一些工作的PHP代碼與此交易,如:

function unescape_special_chars(&$value, $key) { 
    $value = html_entity_decode($value, ENT_QUOTES, 'UTF-8'); 
} 
... 

$response = json_decode($response->getBody(), true); 
// the data has been run through htmlspecialchars(), we must undo this 
array_walk_recursive($response, 'unescape_special_chars'); 

這是很好的,我不知道或不關心返回的JSON對象的結構是什麼,但上面走它,修復了這一切

我需要將這些代碼重寫爲Java,並且使用Play!框架。我對Play很新,在Java上生鏽。這裏是我迄今爲止在一個實用程序類我的Play應用程式內:

protected Promise<JsonNode> consumeApi() throws Exception { 
    Promise<Response> resultsP = WS.url(REST_URL).post(""); 
    Promise<JsonNode> jsonNodeP = resultsP.map(new Function<Response, JsonNode>() { 
     public JsonNode apply(Response response) throws Throwable { 
      // Here I need to "array_walk_recursive" in Java/Jackson 
      return response.asJson(); 
     } 
    }); 
    return jsonNodeP; 
} 

我怎樣才能做到在Java和/或傑克遜相似的地方?我有一種感覺,我應該能夠遍歷由JsonNode提供的樹模型,但是我可以在正確的方向上使用一些建議或指針。謝謝。

回答

0

我能「array_walk_recursive」的JsonNode樹和一個自定義的用戶提供的回調,類似於上面我的PHP解決方案修復它,用下面的:

​​

StringEscapeUtilsorg.apache.commons.lang3JsonUtils樣子:

public class JsonUtils { 
    public interface TextFixer { 
     public String fix(String string); 
    } 

    public static JsonNode walkJsonNode(JsonNode node, TextFixer fixer) { 
     if (node.isTextual()) { 
      String fixedValue = fixer.fix(node.getTextValue()); 
      return new TextNode(fixedValue); 

     } else { 
      if (node.isArray()) { 
       ArrayNode array = (ArrayNode)node; 
       for (int i = 0; i < array.size(); i++) { 
        JsonNode value = array.get(i); 
        JsonNode fixedValue = walkJsonNode(value, fixer); 
        array.set(i, fixedValue); 
       } 

      } else if (node.isObject()) { 
       ObjectNode object = (ObjectNode)node; 
       Iterator<String> ite = object.getFieldNames(); 
       while (ite.hasNext()) { 
        String fieldName = ite.next(); 
        JsonNode value = object.get(fieldName); 
        JsonNode fixedValue = walkJsonNode(value, fixer); 
        object.put(fieldName, fixedValue); 
       } 
      } 

      return node; 
     } 
    } 
} 

注意這是傑克遜1.9.10,這是目前正在與最新的Play(2.1)出貨;傑克遜2.x有一些差異。如果有人有任何改進建議,請發表評論。希望這段代碼能夠對未來與傑克遜合作的Google員工有所幫助。