今天给各位分享javajson循环引用的知识,其中也会对java如何解决循环引用进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、JSON.stringify()循环引用报错2、Gson是怎么解决循环问题的3、java中json怎么运用?4、java如何遍历json 请具体点
JSON.stringify()循环引用报错
上面的错误信息告诉我们, 对象中存在循环引用, 解决思路就是通过自定义stringify方法,设置一个全局缓存变量,stringify的第二个参数如果是function时,他会传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:””。所以,便有了如下解决方案:
Gson是怎么解决循环问题的
Gson本身并不提供循环引用的直接解决方案。我们可以通过以下方式来解决循环引用的问题:
使用ava关键字transient
Java代码
private transient int value = 3;
在序列化的时候value不会生成到json字符串中。
使用Gson提供的注解@Expose
Java代码
@Exclude
private String value;
当然,要使用这个属性必须通过以下语句来构造Gson对象
Java代码
new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
我们也可以自定义注解来标注需要过滤的属性,参见官方的User Guide,需要使用到过滤策略,在下文也会提到。
使用排除策略
以上只能是通过“硬编码”的方式来排除属性,有些时候我们需要根据某种来选择性得过滤一些属性。这是我们可以使用使用Gson提供的排除策略ExclusionStrategy接口。如:
Java代码
public class MyExclusionStrategy implements ExclusionStrategy {
private MyExclusionStrategy(Class? typeToSkip) {
}
public boolean shouldSkipClass(Class? clazz) {
return false;
}
public boolean shouldSkipField(FieldAttributes f) {
return false;
}
}
我们可以通过类级别和属性级别来过滤属性。以上提到的关于自定义注解的实现是在属性级别上实现的。具体方法是
Java代码
public boolean shouldSkipField(FieldAttributes f) {
// Foo是一个自定义注解
return f.getAnnotation(Foo.class) != null;
}
一般情况下,我们可以通过根据属性名的判断来实现实现逻辑过滤。当然,在序列化之前,需要用一下代码来构造Gson对象:
Java代码
Gson gson = new GsonBuilder()
.setExclusionStrategies(new MyExclusionStrategy(SomeObject.class))
.create();
自定义序列化器
在有些情况下,我们可能会为某一个类来绑定一种序列化或反序列化器。
Java代码
public class MyAdaper1 implements JsonSerializerDataStore {
@Override
public JsonElement serialize(DataStore src, Type typeOfSrc,
JsonSerializationContext context) {
ExclusionStrategy strategy = new DmsExclusionStrategy(
src.getExcludeFields(), src.getExcludeClasses());
Gson gson = new GsonBuilder().setExclusionStrategies(strategy)
.serializeNulls().create();
return gson.toJsonTree(src);
}
}
注册序列化器:
Java代码
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MyType1.class, new MyTypeAdapter())
.registerTypeAdapter(MyType2.class, new MyTypeAdapter2());
java中json怎么运用?
json一般都是配合ajax一起使用的 我做做过的小例子 粘给你 你可以研究一下
js部分
//获取卡的金额
function get_money(){
var str=document.getElementById(“pk_card_type”).value;
//alert(str);
var url = ‘/member_h.do’;
var pars = ‘method=getMoney’;
pars+=’pk_card_type=’+str;
var ajax = new Ajax.Request(
url,
{method:’post’,parameters:pars,onComplete:show_money}
);
}
//回调函数 写入卡的金额
function show_money(dataResponse)
{
var data = eval(‘(‘ + dataResponse.responseText + ‘)’);
var price=0;
price=data.price;
var collection_fees=0;
collection_fees=data.collection_fees;
document.getElementById(“recharge”).value=price;
document.getElementById(“collection_fees”).value=collection_fees;
}
action部分
public ActionForward getMoney(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
response.setContentType(“text/html; charset=utf-8”);
try {
IElementaryFileService ggsv = new ElementaryFileService();
String pk_card_type = request.getParameter(“pk_card_type”);
Card_TypeVO ctvo=new Card_TypeVO();
ctvo=ggsv.queryByPK(Card_TypeVO.class, pk_card_type);
PrintWriter out = response.getWriter();
// 这里的数据拼装一般是从数据库查询来的
JSONObject jsonObject = new JSONObject();
if(ctvo!=null){
jsonObject.put(“price”, ctvo.getCard_money());
jsonObject.put(“collection_fees”, ctvo.getCash());
}else{
jsonObject.put(“price”, 0);
jsonObject.put(“collection_fees”, 0);
}
out.print(jsonObject.toString());
out.flush();
out.close();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
java如何遍历json 请具体点
json是字符串,java 没有提供API遍历json吧,要借助jar包,也就是第三方的API,对json格式的字符串或是java对象之间的转换,比如:
一个json格式的字符串,用第三方API(比如gson或jackjson)对json格式字符串进行转换为List类型的,然后用for循环对这list 遍历输出即可,其它对象也是可以的,自定义的实体也行,gson或jackjson有对应的方法能做到
关于javajson循环引用和java如何解决循环引用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。