FlexJson десериализует ссылку на объект - PullRequest
0 голосов
/ 13 сентября 2011

Я использую Spring Roo, который сгенерировал набор классов hibernate и FlexJSON .

У меня есть объект с именем Местоположение и объект с именем Комментарий .Местоположение имеет много комментариев (1: M).

Я пытаюсь сгенерировать объект JSON, который будет, когда десериализован и вставит ссылку на существующий объект Location.

КогдаЯ опускаю поле местоположения, все работает нормально, например:

{ 
   "date": 1315918228639, 
   "comment": "Bosnia is very nice country" 
}

Я не знаю, как ссылаться на поле местоположения.Я пробовал следующее, но без особого успеха:

{
   "location": 10,  
   "date": 1315918228639, 
   "comment": "Bosnia is very nice country" 
}

, где идентификатор местоположения равен 10.

Как я могу ссылаться на поле местоположения в JSON?

Редактировать:Добавлен комментарий объекта:

@RooJavaBean
@RooToString
@RooJson
@RooEntity
public class Komentar {

    private String comment;

    @ManyToOne
    private Location location;

    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(style = "M-")
    private Date date;

}

Ответы [ 3 ]

1 голос
/ 14 сентября 2011

Я решил проблему, добавив временное свойство.

@Transient
public long getLocationId(){
    if(location!=null)
        return location.getId();
    else 
        return -1;
}

@Transient
public void setLocationId(long id){
    location = Location.findLocation(id);
}
0 голосов
/ 05 апреля 2013

Я получил ту же проблему и решил ее, введя фабрику пользовательских объектов.

Поскольку JSONDeserializer ожидает объект json для атрибута местоположения (например: "Location": {"id": 10, ..})предоставление идентификатора местоположения в виде String / Integer (например, «Location»: «10») даст вам исключение.

Поэтому я написал класс LocationObjectFactory и рассказывал flexjson, как десериализовать объект класса Location желаемым способом.

public class LocationObjectFactory implements ObjectFactory {

    @Override
    public Object instantiate(ObjectBinder context, Object value,
            Type targetType, Class targetClass) {

        if(value instanceof String){
            return Location.findProblem(Long.parseLong((String)value));
        }
        if(value instanceof Integer){
            return Location.findProblem(((Integer)value).longValue());
        }
        else {
            throw context.cannotConvertValueToTargetType(value,targetClass);
        }

    }

}

и десериализовал строку json следующим образом

new JSONDeserializer<Komentar>().use(null, Komentar.class).use(Location.class, new LocationObjectFactory()).deserialize(json);
0 голосов
/ 14 октября 2012

У меня похожая проблема, но я не могу изменить входящее сообщение json, поэтому я изменил сгенерированный файл аспекта:

@RequestMapping(value = "/jsonArray", method = RequestMethod.POST, headers = "Accept=application/json")
public ResponseEntity<String> Komentar.createFromJsonArray(@RequestBody String json) {
    for (Komentar komentar: Komentar.fromJsonArrayToProducts(json)) {
        komentar.setLocation(Location.findLocation(komentar.getLocation().getId()));
        komentar.persist();
    }
    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json");
    return new ResponseEntity<String>(headers, HttpStatus.CREATED);
}

komentar.setLocation (Location.findLocation (komentar.getLocation () .getId ())); был добавлен мной.

...