Как заставить FlexJson в java десериализовать объект json в строку? - PullRequest
1 голос
/ 20 февраля 2012

Итак, я получаю объект обратно с сервера, который выглядит так:

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

Однако, когда я получаю этот объект обратно, я хочу десериализовать его в класс Java, который выглядит следующим образом:

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

Но FlexJson видит объект как атрибут данных и затем пытается привести HashMap к моей строке данных. Если я получу ответ с нулевым значением в качестве атрибута данных, все будет работать нормально (поскольку вы можете назначить нулевое значение для строки).

Как мне сказать FlexJson не пытаться сделать HashMap из атрибута Data и просто принять его как String (даже если это объект JSON)?

Прямо сейчас моя строка кода десериализации выглядит так:

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

Спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Это сложно, потому что он анализирует JSON в промежуточную форму, прежде чем он начинает связывать его с объектом.Таким образом, он уже проанализирован в HashMap, прежде чем он начнет запрашивать объект для того, какие типы он должен использовать.Если вы хотите поместить его в строку, вам придется превратить его обратно в JSON.Вы можете сделать это, используя ObjectFactory и привязав его к пути в вашем объекте.Внутри ObjectFactory он может затем превратить это в строку и связать это с объектом там.

new JSONDeserializer<...>()
    .use( "values", Response.class )
    .use( "values.Data", new JSONStringTransformer() )
    .deserialize( json, Response.class );
0 голосов
/ 20 июня 2014

У меня была такая же глупая проблема, но я решил написать свой собственный ObjectFactory, чтобы решить ее.

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);
    }
}

В коде клиента вам просто нужно использовать фабрику следующим образом:

MyDomainClass foo = new JSONDeserializer<MyDomainClass>()
    .use("sillyJSONField", new JSONStringFactory())
    .deserialize(requestJson, MyDomainClass.class);
...