FlexJson反序列化对象引用

时间:2011-09-13 13:03:35

标签: json hibernate serialization spring-roo

我正在使用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" 
}

其中,位置ID为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 个答案:

答案 0 :(得分:1)

我通过添加瞬态属性解决了问题。

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

@Transient
public void setLocationId(long id){
    location = Location.findLocation(id);
}

答案 1 :(得分:0)

有类似的问题,但我无法更改传入的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()));

答案 2 :(得分:0)

我遇到了同样的问题并通过引入自定义对象工厂解决了这个问题。

由于JSONDeserializer期望json对象具有location属性(例如:“Location”:{“id”:10,..}),因此将位置id提供为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);