wie Deserialisieren / serialisieren byte-array mit Hilfe von Jackson und wrapper-Objekt
Ich habe zwei folgenden Klassen:
public class User {
private String name;
private Secret secret;
public User( @JsonProperty("name") String name, @JsonProperty("secret") Secret secret ) {
this.name = name;
this.secret = secret;
}
public String getName() {
return name;
}
public Secret getSecret() {
return secret;
}
}
und
public class Secret {
private byte[] secret;
public Secret( byte[] secret ) {
this.secret = secret;
}
@JsonValue
public byte[] getSecret() {
return secret;
}
}
Möchte ich so verwenden Sie diese Klassen zu serialisieren /Deserialisieren folgenden json:
{
"name": "bdf",
"secret": "AQ=="
}
Java, json funktioniert. Aber wenn ich versuche, json Deserialisieren, bekomme ich die folgende exception:
com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class deserialization.Secret] from String value ('YQ=='); no single-String constructor/factory method
at [Source: [B@3b938003; line: 1, column: 25] (through reference chain: deserialization.User["secret"])
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:875)
at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:281)
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:284)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1176)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:143)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:134)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:520)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:461)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:376)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1099)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:294)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:131)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3702)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2807)
at deserialization.SerializationTest.itShouldDeserialize(SerializationTest.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Wie kann ich feststellen, jackson zum ersten Dekodieren von base64-kodierten Wert und dann wird dieser Konstruktor?
public Secret( byte[] secret )
Ich fand noch mehr Eleganz Variante hier: stackoverflow.com/questions/11546917/...
InformationsquelleAutor Lukasz Rozek | 2016-12-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese kann getan werden, indem schreiben Sie Ihre eigene benutzerdefinierte serializer und deserializer.
http://www.baeldung.com/jackson-custom-serialization
http://www.baeldung.com/jackson-deserialization
Hier ist ein Beispiel ähnlich zu dem, was Sie tun...
Halter Klasse
Bytes class
Beachten Sie die Anmerkungen für die benutzerdefinierte serializer...
Serializer
Diese serialisieren ein "Byte" Objekt als base64-string...
Deserializer
Main-Methode
Einen einfachen test Methode...
Ausgabe
Führen Sie es selbst
Alle Klassen, die oben sind "statisch", da würd ich wickelte Sie in eine große Klasse "Stack".
Wenn Sie ausführen möchten, erstellen Sie eine neue Klasse genannt (was Sie wollen) und fügen Sie den gesamten code hier hinein...
InformationsquelleAutor BretC