Как заставить Flexjson в Java покинуть объект JSON в строке?

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

  •  27-10-2019
  •  | 
  •  

Вопрос

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

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

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

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

Но Flexjson видит объект как атрибут данных, а затем пытается поднять Hashmap в мою строку данных. Если я получаю ответ с «null» в качестве атрибута данных, все работает очень хорошо (поскольку вы можете назначить NULL строке).

Как я могу сказать Flexjson не пытаться сделать хэшмап из атрибута данных и просто взять его как строку (даже если это объект JSON)?

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

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

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

Это было полезно?

Решение

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

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

Другие советы

У меня была такая же глупая проблема, но я пошел вниз по дороге, чтобы написать свой собственный объект 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top