JSON的配置和使用

Josn的配置和使用

  • JSON的基本概念

1.JSON(JavaScript Object Natation) —-javascript的对象表现形式,但是目前已经发展成为一种轻量级的数据交换格式

最大特点:完全独立于语言的文本格式(跨平台数据格式)不依赖于任何语言、有结构的、方便人和机器解析

使用场景:
1):不同语言之间的数据传递(Json的本质就是String,但是它是有格式的),后台的list转换为json,前端才可以解析

比如EasyUI(javascript )+SSH(java)之间的数据传递
2)前端的js和后台的java数据传递
比如:java处理完数据以List /Map/Set的数据格式输出,但是这些数据格式无法被js识别
SSH和easyUI/EXTJS/Ajax进行交互是通过json格式数据来进行的
SSH和Flex(Adobe Flash)也是通过json格式的数据
HTML5 WebSocket —>javascript 之间的数据也是json

JSON与XML、Properties的区别
1.json是轻量级的,而XML是重量级的(比如web.xml配置过滤器、监听器以及各种web组件 其中重要信息数据还没有描述数据的标签多)xml的可读性是建立的在大量标签基础之上的。
目前xml一般用于项目(框架)配置,而很少用来进行数据传输
2.json是有结构的,但是properties仅仅是key-value键值对,意味着json可以传送一些丰富复杂的数据,可以传送含有子对象的对象

  • JSON语法介绍
    官网:www.json.org

空对象:{ }
json对象的结构:
这里写图片描述

{ "key":"value","key":"value"}

json数组的表现结构:
这里写图片描述

value可以是多种类型

[{ "key":"value","key":"value"},{ "key":"value","key":"value"},"abc"]

数值型
-3、3.5 、3.5e+5、5e-7、2e2合法

这里写图片描述

  • JSON语法测试
    要将java对象转换成json对象,必须依赖一些jar包
    json-lib-2.4-jdk1.5.jar所需要的全部jar包(6个)

这里写图片描述

commons-beanutils-1.8.0.jar
commons-collections-3.2.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
ezmorph-1.0.6.jar
json-lib-2.4-jdk15.jar

新建JUint Test Case ,类名自定义

package cn.jxy.json;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

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

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class JSONTest {

    private static Grade grade;

    private static Student student;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        System.out.println("----测试方法执行之前执行----");
        student = new Student();
        grade = new Grade();
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        System.out.println("----测试方法执行之后执行----");
        student = null;//目的:释放资源
        grade = null;
    }

    @Test
    // 测试Java对象转成Json的格式
    public void test() {
        grade.setId(1);
        grade.setName("java net");
        System.out.println(JSONSerializer.toJSON(grade));
    }

    @Test
    // 测试数组的JSON表现形式
    public void test2() {
        grade.setId(1);
        grade.setName("java");
        Student student = new Student();
        student.setName("小王");
        student.setDate(new Date());
        Student student2 = new Student();
        student2.setName("小李");
        student2.setDate(new Date());
        List<Student> stuList = new ArrayList<Student>();
        stuList.add(student);
        stuList.add(student2);
        grade.setStulist(stuList);
        System.out.println(JSONSerializer.toJSON(grade));//日期会具体细分新的json
    }

    @Test // 测试static是不能转化为json属性的
    public void test3() {
        student.setDate(new Date());
        student.setName("admin");
        student.setAge(18);
        System.out.println(JSONSerializer.toJSON(student));
        // 如果返回的是static,或者返回的类型不确定,那么可以采用map或者自己构建json格式
        JSONObject object = new JSONObject();
        object.put("age", student.getAge());
        object.put("date", student.getDate());
        object.put("name", student.getName());
        System.out.println(object.toString());
    }

    @Test // 解决自关联的问题
    public void test4() {
        student.setDate(new Date());
        student.setName("admin");
        //student.setStudent(new Student());
        // 通过配置jsonConfig来过滤相应的参数
        JsonConfig config=new JsonConfig();
        // 设置需要排除哪些字段, 例如排除密码字段
        config.setExcludes(new String[]{"date"});
        // 设置如果有些字段是自关联则过滤  STRICT: 缺省值,是否自关联都要转化
        // LENIENT: 如果有自关联对象,则值设置为null
        // NOPROP: 如果自关联则忽略属性
        config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
        System.out.println(JSONObject.fromObject(student, config));
    }

    @Test // 通过自定义日期的处理类,来格式化日期数据
    public void test5() {
        student.setDate(new Date());
        student.setName("admin");
        JsonConfig config=new JsonConfig();
        // 指定某个Json类型的处理方式
        DataJsonValueProcessor dataValue=new DataJsonValueProcessor();
        config.registerJsonValueProcessor(Date.class, dataValue);
        System.out.println(JSONObject.fromObject(student, config));
    }

    @Test // 通过自定义日期的处理类,来格式化日期数据
    public void test6() {
        // JSONObject 可以自定义对象,JSONArray可以自定义数组
        JSONObject obj=new JSONObject();
        obj.put("id", 123);
        obj.put("name","admin");
        JSONObject obj2=new JSONObject();
        obj2.put("id", 234);
        obj2.put("name","xyz");
        JSONArray array=new JSONArray();
        array.add(obj);
        array.add(obj2);
        // 吧array对象在存储到obj对象中
        JSONObject temp=new JSONObject();
        temp.put("array", array); // {array:[{id:123,name:'admin'},{.....}]}
        System.out.println(JSONObject.fromObject(temp));
    }
}

将一个java对象转换为 json

JSONSerializer.toJSON(grade);

如果有字符串中含有特殊符号\t
前端发现\t会自动解释为tab键

  • *如何转换为static字段

如果Student类中有静态属性(即用static声明的属性)

// 默认static属于类的,而非对象的.
private static Integer age;
public static Integer getAge() {
    return age;
}
public static void setAge(Integer age) {
    Student.age = age;
}

则在转换成json时无法识别

@Test // 测试static是不能转化为json属性的
public void test3() {
    //student.setDate(new Date());
    student.setName("admin");
    student.setAge(18);
    System.out.println(JSONSerializer.toJSON(student));

无法正常输出age字段

解决方法:
1)此方案不是很好 在web开发中会有线程安全的问题

  //去掉get和set的static修饰符
public  Integer getAge() {
    return age;
}
public  void setAge(Integer age) {
    Student.age = age;
}

可以正常转化为json

2)或者可以采用map(先行构建map,再将map转换为json)或者自己构建json格式(JSONObject–实质是一个map)

    // 如果返回的是static,或者返回的类型不确定,那么可以采用map(先行构建map,再将map转换为json)或者自己构建json格式(JSONObject--实质是一个map)
    JSONObject object = new JSONObject();
    object.put("age", student.getAge());
    object.put("date", student.getDate());
    object.put("name", student.getName());
    System.out.println(object.toString());

对于零散数据map格式的数据使用比较多,跟对象属是否为static没有关系

  • 自关联解决方案

如果在Student类中还有一个属性(是它自己的类对象)

private Student student = this;
public Student getStudent() {
    return student;
}
public void setStudent(Student student) {
    this.student = student;
}


@Test // 解决自关联的问题
public void test4() {
    student.setDate(new Date());
    student.setName("admin");
System.out.println(JSONSerializer.toJSON(student));
}

此时执行会报错 net.sf.JSONException:There is acycle in the hierarchy 循环错误

解决方案

@Test // 解决自关联的问题
public void test4() {
    student.setDate(new Date());
    student.setName("admin");
    //通过配置jsonConfig来过滤相应的参数
    JsonConfig config=new JsonConfig();
    // 设置需要排除哪些字段, 例如排除密码字段
    config.setExcludes(new String[]{"student","date"});
 JSONObject.fromObject(student,config);
System.out.println(JSONObject.fromObject(student,config).toString());  
}

或者可以排除date字段

由于上述参照的是自己

private Student student = this;

但有时候

private Student student;
public Student getStudent() {
    return student;
}
public void setStudent(Student student) {
    this.student = student;
}

@Test // 解决自关联的问题
public void test4() {
    student.setDate(new Date());
    student.setName("admin");
    //student.setStudent(new Student());
    // 通过配置jsonConfig来过滤相应的参数
    JsonConfig config=new JsonConfig();
    // 设置需要排除哪些字段, 例如排除密码字段
    config.setExcludes(new String[]{"date"});
    // 设置如果有些字段是自关联则过滤  STRICT: 缺省值,是否自关联都要转化
    // LENIENT: 如果有自关联对象(是不是this),则值设置为null
    // NOPROP: 如果自关联则忽略属性(是this的话不管,没有设个属性)
    config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
    System.out.println(JSONObject.fromObject(student, config).toString());
}
  • Date格式处理
    一般通过json传递的date都是字符串,这样就避免了这种转换

new Date() 转化为json的时候会细分到时分秒
期望用年月日的形式来展示

@Test // 通过自定义日期的处理类,来格式化日期数据
public void test5() {
    student.setDate(new Date());
    student.setName("admin");
    JsonConfig config=new JsonConfig();
    // 指定某个Json类型的处理方式 不仅仅可以处理日期
    DataJsonValueProcessor dataValue=new DataJsonValueProcessor();
    config.registerJsonValueProcessor(Date.class, dataValue);
    System.out.println(JSONObject.fromObject(student, config));
}

扩展类

public class DataJsonValueProcessor implements JsonValueProcessor {

    private String format = "yyyy-MM-dd HH:mm:ss";
    private SimpleDateFormat sdf = new SimpleDateFormat(format);

    @Override
    //针对数组
    public Object processArrayValue(Object arg0, JsonConfig arg1) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    // 需要处理日期的相关格式
    //针对于普通值 arg0:匹配字段date  arg1:date字段的值  arg2:jsonconfig对象
    public Object processObjectValue(String arg0, Object arg1, JsonConfig arg2) {
        if (arg1 == null) {
            return "";
        } else if (arg1 instanceof Date) {
            return sdf.format((Date) arg1);
        }else{
            return arg1.toString();
        }
    }

}
  • JSONArray的使用
    JSONObject实际上是一个map,可以自定义对象,
    而JSONArray可以自定义数组
    可以把对象放到数组里边 也可以把数组放到对象里边

    @Test
    public void test6() {
    // JSONObject 可以自定义对象,JSONArray可以自定义数组
    JSONObject obj=new JSONObject();
    obj.put(“id”, 123);
    obj.put(“name”,”admin”);
    JSONObject obj2=new JSONObject();
    obj2.put(“id”, 234);
    obj2.put(“name”,”xyz”);
    JSONArray array=new JSONArray();
    array.add(obj);
    array.add(obj2);
    // 把array对象在存储到obj对象中
    JSONObject temp=new JSONObject();
    temp.put(“array”, array); // {array:[{id:123,name:’admin’},{…..}]}
    System.out.println(JSONObject.fromObject(temp));
    }

这里写图片描述

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值