2016-08-06 11 views
0

Diese Frage von Link Duplikat ist, wird-Code verwendet wie:Jackson: Shop verschachteltes JSON-Objekt als JSONObject

ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); 
Car car = mapper.readValue(new File("fileName"), Car.class); 

Aber für settings wie in der Verbindung gegeben, Wert kommt als {}. Wie kann ich dieses Problem lösen? Ich möchte geschachteltes Objekt als JSONObject verwenden.

+0

Versuchen Sie, die Anmerkungen zu verwenden, verwendet '@ JsonAnySetter' und' @ JsonAnyGetter' [hier] (http://www.programcreek.com/java-api-examples/index.php?api=com.fasterxml.jackson.annotation.JsonAnySetter) ein Beispiel, wie man es benutzt. –

+0

@MarioAlexandroSantini Ich versuchte ** Beispiel1 ** von Link Sie zur Verfügung gestellt. Aber es setzt auch den Rest des Feldes, das nicht in POJO 'Car' ist. Ich wollte nur ein Objekt, das unter dem Schlüssel 'setting' steht (was' JSONObject' ist) –

Antwort

0

Zunächst einmal meinen Sie JsonObject, die von Java EE 7 und nicht JSONObject Standard ist, die in Android ist.

Sogar in der Verbindung, die Sie zur Verfügung stellen, sprechen sie darüber.

als, hier ist mein Auto Beispiel:

Paket org.mas.examples.jackson.models;

import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonProperty; 

import javax.json.JsonObject; 

public class Car { 

    @JsonProperty(value="id") 
    private long id; 

    @JsonProperty(value="name") 
    private String name; 

    @JsonIgnore 
    private JsonObject settings; 

    public void setId(long id) { 
     this.id = id; 
    } 

    public long getId() { 
     return this.id; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void setSettings(JsonObject settings) { 
     this.settings = settings; 
    } 

    public JsonObject getSettings() { 
     return settings; 
    } 

    @JsonAnySetter 
    public void setJsonProperty(String key, Object value) { 

     if ("settings".equals(key)) { 

      System.out.println("Got it " + key + " value: " + value); 

      /* JsonObject settings = ....; create here your JsonObject */ 

     } else { 
      System.out.println(key + " value: " + value); 
     } 

    } 
} 

Wenn Sie führen einen Test wie folgt aus:

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

try { 
    Car car = objectMapper.readValue(json, Car.class); 

    System.out.println("Load a car: " + car.getName()); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

Sie werden das folgende Ergebnis zu erhalten:

Got it settings value: {color=#ff0000} 
Load a car: test 

es nur auf Einstellungen So arbeiten wie beschrieben in Jackson Anmerkung doc:

@JsonAnySetter: Anmerkung zur Definition eines zweiargumentigen Verfahren als „jeder Setter“, für Deserialisieren Werte von sonst nicht zugeordneten JSON Eigenschaften