Wie kann man Flexjson in Java zwingen, ein JSON -Objekt zu einer Saite zu deserialisieren?

StackOverflow https://stackoverflow.com/questions/9353447

  •  27-10-2019
  •  | 
  •  

Frage

Ich bekomme also ein Objekt von einem Server zurück, der so aussieht:

{
    "Status": {
        "stuff":"stuff...";
        "morestuff":"morestuff...";
        };
    "Data": { ... another object ... };
}

Wenn ich dieses Objekt jedoch zurückbekomme, möchte ich es in eine Java -Klasse deserialisieren, die so aussieht:

class Response
{
    public StatusObject Status;
    public String Data;
}

Aber Flexjson sieht ein Objekt als Datenattribut und versucht dann, eine Hashmap in meine Datenzeichenfolge zu geben. Wenn ich eine Antwort mit 'null' als Datenattribut zurückhole, funktioniert alles gut (da Sie einer Zeichenfolge Null zuweisen können).

Wie kann ich Flexjson sagen, er solle nicht versuchen, ein Hashmap aus dem Datenattribut herauszuholen und sie einfach als Zeichenfolge zu nehmen (auch wenn es sich um ein JSON -Objekt handelt)?

Im Moment sieht meine Deserialisierungszeile von Code so aus:

formattedResponse = new JSONDeserializer<network.Response>()
                    .use( "values", network.Response.class )
                    .deserialize(JSONString, network.Response.class);

Vielen Dank für jede Hilfe!

War es hilfreich?

Lösung

Das ist schwierig, weil es den JSON in eine Zwischenform analysiert, bevor es anfängt, ihn in das Objekt zu binden. Daher ist es bereits in eine HashMap analysiert, bevor es beginnt, das Objekt für die Typen zu befragen. Wenn Sie es in eine Zeichenfolge setzen wollten, werden Sie es wieder in JSON verwandeln. Sie können dies mit einem ObjectFactory tun und dies an den Pfad in Ihrem Objekt binden. In der Objektfaktorin könnte es dann in die Zeichenfolge verwandeln und in das dort einbinden.

new JSONDeserializer<...>()
    .use( "values", Response.class )
    .use( "values.Data", new JSONStringTransformer() )
    .deserialize( json, Response.class );

Andere Tipps

Ich hatte das gleiche dumme Problem, aber ich ging auf den Weg, mein eigenes Objekt zu schreiben, um sie zu lösen.

package mypackage

import flexjson.JSONSerializer;
import flexjson.ObjectBinder;
import flexjson.ObjectFactory;

import java.lang.reflect.Type;

public class JSONStringFactory implements ObjectFactory {
    @Override
    public Object instantiate(ObjectBinder objectBinder, Object o, Type type, Class aClass) {
        return new JSONSerializer().deepSerialize(o);
    }
}

Im Client -Code müssen Sie nur die Fabrik wie diese verwenden:

MyDomainClass foo = new JSONDeserializer<MyDomainClass>()
    .use("sillyJSONField", new JSONStringFactory())
    .deserialize(requestJson, MyDomainClass.class);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top