2017-06-23 2 views
0

Mein String-Eingang ist so etwas wie:ersetzen Teil des String von Regular Expression

{"key1":"value1","key2":"{\"key2_1\":\"123\",\"key2_2\":\"456\",\"key2_3\":\"33333\"}"} 

Die Wertfelder in der obigen JSON könnte Zeichen wie ", \ und so weiter enthalten. Für Ihre convience hier ist die formatierte Version:

{ 
    "key1": "value1", 
    "key2": "{\"key2_1\":\"123\",\"key2_2\":\"456\",\"key2_3\":\"33333\"}" 
} 

Ich möchte Gson verwenden, um den String in eine Foo-Objekt zu konvertieren:

class Foo { 
    private String key1; 
    private Bar key2; 
    ... 
} 

class Bar { 
    private String key2_1; 
    private String key2_2; 
    private String key2_3; 
    ... 
} 

Hier ist mein regulärer Ausdruck:

String regexp = "\\{[\"a-zA-Z-0-9:,\\\\]*\"key2\":\"\\{\\\\\"key2_1\\\\\":\\\\\"[a-zA-Z0-9]*\\\\\",\\\\\"key2_2\\\\\":\\\\\"[a-zA-Z0-9]*\\\\\",\\\\\"key2_3\\\\\":\\\\\"[a-zA-Z0-9]*\\\\\"\\}\"\\}[\"a-zA-Z-0-9:,\\\\]*"; 
Pattern pattern = Pattern.compile(regexp); 
Matcher matcher = pattern.matcher(text); 
if(matcher.matches()) { 
    ... // TODO: Replace all "{, \" and }" but How??? 
} 

Wie kann ich diesen regulären Ausdruck verwenden, um alle "{, \". Und "} inzu ersetzen, ", } ohne die Schlüssel und Werte in JSON zu ändern?

Das Finden der Unterzeichenfolge und die Verwendung der Ersetzungsmethode von String ist meine Sicherungslösung.

Noch einmal, mein ultimatives Ziel ist es, den Input String in mein Foo-Objekt zu zerlegen. Gibt es einen besseren Weg als den regulären Ausdruck?

Vielen Dank!

+0

Sollte es nicht einfach so gut funktionieren? – Shark

+0

@Shark Matcher gibt nur einen booleschen Wert zurück. Ich konnte den String nicht in "so einfach" umwandeln.Bitte beachten Sie, dass der Eingabewert von key2 ein String ist und im Foo-Objekt das entsprechende Feld ein Bar-Objekt ist. –

+0

Was ich meine ist, das JSON enthält bereits ein 'Bar'-Objekt; sollte es nicht gut in eine "Foo" -Instanz zerlegen? – Shark

Antwort

1

Nach weiteren Graben, finde ich diese beiden Links:

Gson custom deseralizer for one variable in an object

Gson custom seralizer for one variable (of many) in an object using TypeAdapter

ich erreicht, was ich will meine eigenen JsonDeserializer-GsonBuilder durch die Registrierung:

private static GsonBuilder gsonBuilder = new GsonBuilder().registerTypeAdapter(Bar.class, new JsonDeserializer<Bar>() { 

    @Override 
    public Bar deserialize(JsonElement json, Type typeOfT, 
      JsonDeserializationContext context) throws JsonParseException { 
     Bar result = new Bar(); 
     String regexp = "\"\\{\\\\\"key2_1\\\\\":\\\\\"(?s).*\\\\\".\\\\\"key2_2\\\\\":\\\\\"(?s).*\\\\\",\\\\\"key2_3\\\\\":\\\\\"(?s).*\\\\\"\\}\""; 
     Pattern pattern = Pattern.compile(regexp); 
     Matcher matcher = pattern.matcher(json.toString()); 
     String modifiedJsonStr = json.toString(); 
     if(matcher.matches()) { 
      modifiedJsonStr = json.toString().replace("\"{", "{").replace("}\"", "}").replace("\\\"", "\""); 
     } 
     result = new Gson().fromJson(modifiedJsonStr, Bar.class); 
     return result; 
    } 
}); 

Beifall.

2

Die goldene Regel ist keine regulären Ausdrücke für solche Dinge NUTZEN SIE :) Mein Rat ist zu den JSON Mapper zu suchen, zum Beispiel Jackson

Alles, was Sie tun müssen:

  1. Fix JSON in Ihrem Beispiel, hier ist keine Notwendigkeit, doppelte Anführungszeichen um verschachtelt {
  2. Hinzufügen Jackson Abhängigkeiten

    <dependency> 
        <groupId>com.fasterxml.jackson.core</groupId> 
        <artifactId>jackson-databind</artifactId> 
        <version>${jackson.version}</version> 
    </dependency> 
    
  3. ObjectMapper erstellen und lassen Sie ihn

    ObjectMapper mapper = new ObjectMapper(); 
    Foo foo = mapper.readValue("{\"key1\":\"value1\",\"key2\":" 
        + " {\"key2_1\":\"123\",\"key2_2\":\"456\",\"key2_3\":\"33333\"}}", Foo.class); 
    System.out.println(foo.toString()); 
    

Hoffe, dass es hilft, Ihre JSON-String handhaben!

+0

Das Problem ist die Eingabe JSON ist nicht unter meiner Kontrolle :( –

+0

@ Top.Deck das ist kein Problem, die Lösung wird mit jeder gültigen JSON-Eingabe arbeiten. Verschachtelte Sonderzeichen werden korrekt verarbeitet. –

+0

die Eingabe an Ihrem Code tatsächlich wäre "{\" key1 \ ": \" value1 \ ", \" key2 \ ":" + "{\\\" key2_1 \\\ ": \\\" 123 \\\ ", \\\ "key2_2 \\\": \\\ "456 \", \\\ "key2_3 \\\": \\\ "33333 \\\"}}, so denkt der Code, dass key2 einen String-Wert anstelle von a hat verschachtelte JSON. –