2012-02-19 1 views
1

Так я получаю объект обратно с сервера, который выглядит следующим образом:Как заставить FlexJson в java десериализовать json-объект для строки?

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

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

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

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

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

Сейчас моя десериализации строка кода выглядит следующим образом:

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

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

+0

Таким образом, вы должны сказать это в 3 раза? Greeeaaaat –

ответ

2

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

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

Итак, JSONStringTransformer должен быть обычным ObjectFactory, который я создаю? Я рассмотрю, как создавать специализированные объекты. Спасибо за помощь! Не может работать стандартный StringTransformer? даже если я пытаюсь использовать это, я получаю эту ошибку: метод use (String, ClassLocator) в типе JSONDeserializer не применим для аргументов (String, StringTransformer) – Nico

+0

Нет StringTransformer не будет работать, потому что Transformers используются для перевода объектов в JSON. Вам нужно что-то, что переносит JSON в объекты ObjectFactory. Но классы, которые преобразуют вещи в строки, не будут знать, как перевести HashMap в строку. Это очень странная ситуация, когда вы не хотите брать часть JSON в качестве объектов, а вместо этого вместо этого используете строку части JSON. – chubbsondubs

+0

Все в порядке, так что то, что я делаю, довольно наоборот. Я пытался объединиться с созданием фабрики пользовательских объектов, но это выглядело довольно неприятно, поэтому я только что закончил это: int dataIndex = JSON.indexOf (dataIdentifier); formattedResponse.Data = JSON.substring (dataIndex + dataIdentifier.length() - 2, \t \t \t \t \t JSON.length() - 1); Где dataIdentifier = "\"}, \ "Data \": {\ ""; Это довольно неприятно, но оно работает. – Nico

0

У меня была такая же глупая проблема, но я пошел по пути написания собственного объекта 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);