使用JSONObject.fromObject出现的问题

第一个问题: There is a cycle inthe hierarchy ,异常,

    意思是出现了死循环,也就是Model之间有循环包含关系;当实体类对象之间有多对多,相互包含时,JSON转换死循环。

       解决方法使用setCycleDetectionStrategy防止自包含

代码如下:

   JsonConfig jsonConfig = new JsonConfig();

    jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);

   JSONObject json =JSONObject.fromObject(model, jsonConfig);

   result = json.toString();

依赖的包: 

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.CycleDetectionStrategy;


第二个问题Json中的日期转换

例于:

public String findOfficeIfStock(String flag) {
            List<OfficebuildsVO> oVOList = officebuildService.findOfficeByStock(Boolean.valueOf(flag).booleanValue());            
            String json =JSONArray.fromObject(oVOList).toString();
            return json;
        }

则 json 中日期格式是(一个日期对象): "ptime":{"date":27,"day":6,"hours":4,"minutes":57,"month":6,"seconds":49,"time":1374872269000,"timezoneOffset":-480,"year":113}

而前台要的是“yyyy-MM-dd ” 这种。就要用要日期转换;

   1.先创建一个类

//--------------------------------------------------

package com.cloud.space.util;

import java.text.SimpleDateFormat;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;


/**
 * Json数据中的Date转换成相应该的格式
 * @author zhoujf *
 */
public class DateJsonValueProcessor implements JsonValueProcessor
{
    
    private String format;
    public DateJsonValueProcessor(String format){
        this.format = format;
    }
    
    public Object processArrayValue(Object value, JsonConfig jsonConfig)
    {
        return null;
    }

    public Object processObjectValue(String key, Object value, JsonConfig jsonConfig)
    {
        if(value == null)
        {
            return "";
        }
        if(value instanceof java.sql.Timestamp)
        {
            String str = new SimpleDateFormat(format).format((java.sql.Timestamp)value);
            return str;
        }
        if (value instanceof java.util.Date)
        {
            String str = new SimpleDateFormat(format).format((java.util.Date) value);
            return str;
        }
        
        return value.toString();
    }
}

//-------------------------------------------------------------------------

2.在controller中方法中

//------------------------------------

   . . . . . .

List<OfficebuildsVO>  officebuildsvo= officebuildsService.findOfficebuildsEntityByPage(page1);

  JsonConfig jsoncfg = new JsonConfig();

            jsoncfg.registerJsonValueProcessor(java.util.Date.class,new DateJsonValueProcessor("yyyy-MM-dd"));   

            String result =JSONObject.fromObject(officebuildsvo,jsoncfg).toString();

            return result;

//------------------------------------

   这样 result 中的ptime的值就是"1996-10-20"  了。

注意 导的包:

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;



JSONObject.fromObjectJSONObject.parseObject都是用于将 JSON 字符串转换为 Java 对象的方法。但它们所属的类库不同。 1. JSONObject.fromObject:这个方法是来自于 Java 的 JSON-lib 库。它可以将 JSON 字符串转换为一个 JSONObject 对象,该对象可以方便地操作 JSON 数据。例如,你可以通过该对象获取特定的属性值、修改属性值、添加新的属性等。 示例代码: ``` import net.sf.json.JSONObject; // ... String jsonString = "{\"name\":\"John\", \"age\":30}"; JSONObject jsonObject = JSONObject.fromObject(jsonString); String name = jsonObject.getString("name"); int age = jsonObject.getInt("age"); System.out.println("Name: " + name); System.out.println("Age: " + age); ``` 2. JSONObject.parseObject:这个方法来自于阿里巴巴的 fastjson 库。它可以将 JSON 字符串转换为一个 Java 对象,该对象可以直接与 Java 类型进行交互。使用 parseObject 方法时,你需要指定目标对象的类型。 示例代码: ``` import com.alibaba.fastjson.JSON; // ... String jsonString = "{\"name\":\"John\", \"age\":30}"; Person person = JSON.parseObject(jsonString, Person.class); String name = person.getName(); int age = person.getAge(); System.out.println("Name: " + name); System.out.println("Age: " + age); ``` 需要注意的是,如果你使用的是 fastjson 库,你需要在项目添加 fastjson 的依赖。对于 JSON-lib 库,你需要添加 json-lib 的依赖。 这两种方法在处理 JSON 字符串时都提供了很大的灵活性和便利性,你可以根据自己的需求选择其之一来使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值