2016-06-06 11 views
0

Ich bin der Empfänger eines Webhook-POST, der so aussieht, die ich für die Lesbarkeit dekodiert habe.Konvertierung von assoziativen Array-Anfrage-Parameter zu JSON mit Jackson

id=12345&event=this_event&payload[customer][name]=ABC Company&payload[customer][city]=New York&payload[service][name]=New Customer&payload[service][action]=New 

Mit Spring MVC, kann ich diese einfach in ein Map<String, Sting> erhalten, wie diese

{id=97659204, event=test, payload[customer][name]=ABC Company, payload[customer][city]=New York, payload[service][name]=New Customer, payload[service][action]=New} 

ich jeden Parameter (oder Karte-Taste), die mit „Nutzlast“ in eine JSON beginnt analysieren müssen aussieht Objekt.

Meine gewünschte Ausgabe aus den Anforderungsparametern Parsen, die mit „payload“ beginnen würde so etwas wie diese

{ 
    customer : { 
     name : "ABC Company", 
     city : "New York" 
    }, 
    service : { 
     name : "New Customer", 
     action : "New" 
    } 
} 

Mit der Endzustand einen Aufruf an Jackson ObjectMapper sein zu drehen, dass JSON in ein POJO aussehen.

Da ich keine Kontrolle über das Datenformat habe, senden Sie mir, was ist die beste/richtige Option für das Parsen dieser Anforderungsparameter in ein JSON-Objekt?

Danke.

Antwort

0

Ich schrieb schließlich einen benutzerdefinierten Parser für die übergebenen Payload [] [] [] Parameter. Es verwendet Regex Matcher und dann Rekursion, um jeden Parameter zu analysieren, eine Karte von 1 ... n Maps und dann die resultierende Karte macht JSON perfekt.

@RequestMapping(value = "/receiver", method = RequestMethod.POST) 
@ResponseBody 
public void receiver(@RequestParam Map<String, Object> requestBody) throws IOException { 

    Pattern pattern = Pattern.compile("\\[([^\\]]+)]"); 

    Map<String, Object> payloadMap = new HashMap<>(); 
    Matcher matcher = null; 
    List<String> levels = null; 

    for (String key : requestBody.keySet()) { 

     if (key.startsWith("payload")) { 

      matcher = pattern.matcher(key); 
      levels = new ArrayList<>(); 
      while (matcher.find()) { 
       levels.add(matcher.group(1)); 
      } 

      payloadMap = nestMap(payloadMap, levels.iterator(), (String) requestBody.get(key)); 

     } 
    } 

    LOG.debug(mapper.writeValueAsString(payloadMap)); 

} 

@SuppressWarnings("unchecked") 
private Map<String, Object> nestMap(Map<String, Object> baseMap, Iterator<String> levels, String value) { 

    String key = levels.next(); 

    if (!levels.hasNext()) { 
     baseMap.put(key, value); 
    } else { 
     if (!baseMap.containsKey(key)) { 
      baseMap.put(key, nestMap(new HashMap<String, Object>(), levels, value)); 
     } else { 
      baseMap.put(key, nestMap((Map<String, Object>) baseMap.get(key), levels, value)); 
     } 
    } 

    return baseMap; 

} 
Verwandte Themen