我发现的关于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字符串在一个巨大的循环中?
答案 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。