2016-08-07 4 views
7

Zum Serialisieren von Java-Objekten mit camel case-Attributen nach json mit Unterstrich verwenden wir PropertyNamingStrategy als SNAKE_CASE.Deserialisieren von JSON mit Unterstrichen zum Kamelfall in Java mit Jackson?

Also, gibt es auch etwas zu tun, das Gegenteil zu tun. Das heißt, JSON mit Unterstreichung zu Java-Objekten mit camel-Fall deserialisieren.

Zum Beispiel JSON:

public class User { 
    String userId; // should have value "213sdadl" 
    String channelId; // should have value "asd213l" 
} 

Ich weiß one way of doing this die über @JsonProperty Anmerkung, die auf der Feldebene funktioniert:

{ 
    "user_id": "213sdadl" 
    "channel_id": "asd213l" 
} 

soll auf dieses Java-Objekt deserialised werden. Ich bin daran interessiert, jedes globale Umfeld dafür zu kennen.

+1

@JLewkovich Diese isn Es ist genau ein Duplikat. Bitte lesen Sie die letzte Zeile der Frage. Ich spreche nicht von '@ JsonProperty' Annotation, die die akzeptierte Antwort dort ist. –

+0

Eigentlich Frage haben Sie eine Antwort, die Sie wahrscheinlich interessiert waren, schauen Sie sich die höchste upvoted – Quadrat137

+0

@ Quadrat137 ja Ich habe die Antwort gesehen, können Sie auch meine Kommentare unter der Antwort zu sehen. Es funktionierte nicht in beide Richtungen für mich. Das war meine Frage. –

Antwort

4

Nun Sie eine Implementierung für PropertyNamingStrategy haben kann, die etwa wie folgt aussieht:

import org.codehaus.jackson.map.MapperConfig; 
import org.codehaus.jackson.map.PropertyNamingStrategy; 
import org.codehaus.jackson.map.introspect.AnnotatedField; 
import org.codehaus.jackson.map.introspect.AnnotatedMethod; 

public class CustomNameStrategy extends PropertyNamingStrategy 
{ 
    @Override 
    public String nameForField(MapperConfig 
         config, 
    AnnotatedField field, String defaultName) { 
    return convert(defaultName); 

    } 
    @Override 
    public String nameForGetterMethod(MapperConfig 
         config, 
    AnnotatedMethod method, String defaultName) { 
    return convert(defaultName); 
    } 

    @Override 
    public String nameForSetterMethod(MapperConfig 
         config, 
    AnnotatedMethod method, String defaultName) { 
    String a = convert(defaultName); 
    return a; 
    } 

    public String convert(String defaultName) 
    { 
    char[] arr = defaultName.toCharArray(); 
    StringBuilder nameToReturn = new StringBuilder(); 

    for(int i=0; i< arr.length(); i++){ 
     if(arr[i] == '_'){ 
     nameToReturn.append(Character.toUpperCase(arr[i+1])); 
     i++; 
     }else{ 
     nameToReturn.append(arr[i]); 
     } 
    } 
    return nameToReturn.toString(); 
    } 

} 

dann in Ihrer Implementierung oder die Klasse, die die desrialization Sie haben nicht:

ObjectMapper mapper = new ObjectMapper(); 
mapper.setPropertyNamingStrategy(new CustomNameStrategy()); 
YourClass yourClass = mapper.readValue(yourJsonString, YourClass.class); 
+0

Ich akzeptiere diese Antwort, da dies die einzige Lösung ist, die ich bis jetzt bekommen habe, und ich nehme an, dass es keinen anderen sauberen Weg gibt, dies zu tun. –

Verwandte Themen