在JSON中渲染Hibernated对象?

时间:2015-06-05 18:36:52

标签: java json spring hibernate

我发现的关于JSON的所有网络文章似乎都与数据规范有关;我正在寻找有关清晰实施方法的提示。

我有一个来自Hibernate的持久对象和一个应该返回它们列表的Web服务。

生成的JSON应该包含与数据混合的HATEOAS链接。并且JSON库不应该触发任何错误(解析任何代理),而应将它们转换为href属性。

所以,如果我有2个Customer实例和一个名为/ customers的Web服务,我应该得到如下所示的JSON:

{
    "href" : "/customers",
    "data" : [  {   "id" : 234,
                    "name" : "Bill Shatner",
                    "href" : "/customers/234",
                    "orders" : "/customers/234/orders",
                    "orders-count" : 2
                },
                {
                    "id" : 210,
                    "name" : "Malcolm Reynolds",
                    "href" : "/customers/210",
                    "orders" : "",
                    "orders-count" : 0
                } ]
}

(注意:只是插图,未编码为任何规范,如HAL等)

我觉得我不得不在服务中手动滚动所有这些东西,这感觉就像缺乏经验。当然有一个代理感知的Web框架,允许我创建一个JSON模板并将其传递给我的域对象,并期望得到正确的结果?

@Path("/customers")
public HttpResponse getAllCustomers(HttpRequest req)
{
    @Autowired CustomerRepository custRepo;
    List<Customer> data = custRepo.findAll();
    return ResponseBuilder.status(200).toJSON(data).build();
}

我知道这可能比可能的更神奇,但肯定比为每个持久对象创建HashMap更好,将每个getter硬编码为put并添加硬编码的href字符串在一个巨大的循环中?

2 个答案:

答案 0 :(得分:0)

我使用Gson lib实现Json Convertor,因此您可以使用所有对象,不仅可以使用Hibernated,但在您的情况下,您可以创建抽象类或接口,并使所有休眠对象实现此接口,请查看此示例:

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class JsonConvertor {

    private static GsonBuilder gsonBuilder;
    private static Gson gson;

    private JsonConvertor() {

    }
    public static Object fromJson(String json, Class clz)
    {
        gson=new Gson();
        return gson.fromJson(json,clz);
    }

    public static String toJson(Object obj,List<String> fields) {

        gsonBuilder = new GsonBuilder();
        gsonBuilder = gsonBuilder
                .addSerializationExclusionStrategy(new CustomIclusionStrategy(fields));
        gson = gsonBuilder.create();
        String json = gson.toJson(obj);
        return json;
    }
    public static String toJson(Object obj) {

        gsonBuilder = new GsonBuilder();
        gsonBuilder = gsonBuilder
                .addSerializationExclusionStrategy(new CustomIclusionStrategy(null));
        gson = gsonBuilder.create();
        String json = gson.toJson(obj);
        return json;
    }

}

class CustomIclusionStrategy implements ExclusionStrategy {

    private List<String> fields;

    public CustomIclusionStrategy(List<String> fields) {
        this.fields = fields;
    }

    // called only if shouldSkipClass returns false
    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        if(fields!=null && fields.contains(f.getName()))
        {// exclude
            return true;
        }
        // include in generating JSON
        return false;


    }

    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        // if returns false shouldSkipField will be called, otherwise shouldSkipField will not be called
        return false;
    }
}

这是界面:

public interface JsonConvertable {


    public String toJson();
}

这是示例对象:

public class B {


    private int salary;

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }


}
 public class A {

    private int id;
    private String name;
    private B b;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public B getB() {
        return b;
    }
    public void setB(B b) {
        this.b = b;
    }   
}

以下是如何从生成JSON中排除字段的示例。

public class Test {


    public static void main(String[] args) {
        A a=new A();

        a.setId(1);
        a.setName("safwa");
        a.setB(new B());
        List<String> fields=new ArrayList<String>();
        fields.add("b");
        System.out.println("Exclusion: "+JsonConvertor.toJson(a,fields));
        System.out.println("NO Exclusion: "+JsonConvertor.toJson(a));
    }
}

答案 1 :(得分:0)

实际上,除了正常的JSON支持之外,Spring还提供了一种实现基于HATEOAS的休息服务的简单方法。看看这个link。看看Greetings模型类。 import org.springframework.hateoas.ResourceSupport;。如果您从ResourceSupport扩展您的POJO课程。有一些静态方法可以让你在正常的JSON响应之上添加这些href。