FastJson中@JSONField注解使用

最近做项目中,使用了json格式在服务器之间进行数据传输。但是发现json格式数据不符合JAVA中的变量定义规则,并且难以理解,因此需要在后台中做二次处理,将数据处理成我们系统中定义的格式。

思路:

    1. 定义需要返回的bean,bean中定义需要返回的数据

    2. 获取到需要处理的JSON字符串

    3. 将JSON字符串转换为bean, 再将转换后的bean返回给客户端。

由于json中的key与bean中的属性不能匹配,因此在转换过程中出现了部分属性为null的情况。经过查看官方文档,发现可以使用@JSONField进行解释,但是并没有详细的使用说明。

@JSONField的作用对象:

1. Field
2. Setter 和 Getter方法

注:FastJson在进行操作时,是根据getter和setter的方法进行的,并不是依据Field进行。

Show me the code:

一、作用Field

@JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称
代码如下:

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;  

public class Person {
    @JSONField(name="name")
    private String name;  

    @JSONField(name="age")
    private String age;  

    @JSONField(name="desc")
    private String desc;  

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }  

    public void setNAME(String NAME) {  //没有生效,字段上注解中的name的值为"name",则setter为setName
        this.name = NAME;
    }  

    public void setAGE(String AGE) {  //没有生效,字段上注解中的name的值为"name",则setter为setAge
        this.age = AGE;
    }  

    public void setDESC(String DESC) {  //没有生效,字段上注解中的name的值为"name",则setter为setDesc
        this.desc = DESC;
    }  

    public String toString() {
        return JSONObject.toJSONString(this);
    }
}  

 

 

import org.java.json.fastjson.bean.Person;
import org.junit.Before;
import org.junit.Test;  

import com.alibaba.fastjson.JSONObject;  

public class PersonTest {  

    private Person person;  

    /**
     * 初始化对象
     */
    @Before
    public void setUp() {
        person = new Person();
        person.setName("xianglj");
        person.setAge("20");
        person.setDesc("只是一个测试");
    }  

    @Test
    public void test() {
        String jsonStr = JSONObject.toJSONString(person);
        System.out.println("bean to json:" + jsonStr);  

        //改变json的key为大写
        jsonStr = jsonStr.toUpperCase();  

        System.out.println("需要转换的json:" + jsonStr);
        person = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Person.class);
        System.out.println("json to bean:" + person.getName());
    }
}  

输出如下:

 

bean to json:{"age":"20","desc":"只是一个测试","name":"xianglj"}
需要转换的json:{"AGE":"20","DESC":"只是一个测试","NAME":"XIANGLJ"}
json to bean:null  

从上面我们可以看出,当@JSONField作用在Fileld上时,定义了输入和输出,如果我们传输过来的json格式不符合这个格式时,则不能够正确转换。

二、作用在setter和getter方法上

顾名思义,当作用在setter方法上时,就相当于根据 name 到 json中寻找对应的值,并调用该setter对象赋值。

当作用在getter上时,在bean转换为json时,其key值为name定义的值。实例如下:

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;  

public class Product {  

    private String productName;
    private String desc;
    private String price;  

    @JSONField(name="name")
    public String getProductName() {
        return productName;
    }  

    @JSONField(name="NAME")
    public void setProductName(String productName) {
        this.productName = productName;
    }  

    @JSONField(name="desc")
    public String getDesc() {
        return desc;
    }  

    @JSONField(name="DESC")  //测试代码中对jsonStr有一个toUpperCase的操作。就会这与"DESC"匹配
    public void setDesc(String desc) {
        this.desc = desc;
    }  

    @JSONField(name="price")
    public String getPrice() {
        return price;
    }  

    @JSONField(name="PRICE")
    public void setPrice(String price) {
        this.price = price;
    }  

    public String toString() {
        return JSONObject.toJSONString(this); 
    }  

}  

 

import org.java.json.fastjson.bean.Product;
import org.junit.Test;  

import com.alibaba.fastjson.JSONObject;  

/**
 * 对fastjson中的JSON转换做一个测试
*/
public class JsonObjectTest {  

    public static void main(String[] args) {
        Product product = new Product();
        product.setProductName("产品");
        product.setDesc("这是一个产品");
        product.setPrice("22.3");  

        String jsonStr = JSONObject.toJSONString(product);
        System.out.println("转换为json:" + JSONObject.toJSONString(product));  

        //jsonStr = jsonStr.toUpperCase();
        System.out.println(jsonStr);  

        product = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Product.class);
        System.out.println(product.toString());
    }  

    @Test
    public void test() {
        Product product = new Product();
        product.setProductName("产品");
        product.setDesc("这是一个产品");
        product.setPrice("22.3");  

        String jsonStr = JSONObject.toJSONString(product);
        System.out.println("转换为json:" + JSONObject.toJSONString(product));  

        jsonStr = jsonStr.toUpperCase();
        System.out.println(jsonStr);  

        product = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Product.class);
        System.out.println(product.toString());
    }
} 

输出如下:

转换为json:{"desc":"这是一个产品","name":"产品","price":"22.3"}
{"DESC":"这是一个产品","NAME":"产品","PRICE":"22.3"}
{"desc":"这是一个产品","name":"产品","price":"22.3"}  

有了这个注解之后,我们在转换bean时,就不需要在手工方式,为不能转换的属性进行赋值。即使以后返回数据反生变化,也能够快速的进行修改。不用修改大片代码。只需要修改注解name值就可以了。

这个注解使用就到这里,希望大家喜欢,支持

http://blog.csdn.net/u011425751/article/details/51219242

 

时间: 2024-12-03 01:53:50

FastJson中@JSONField注解使用的相关文章

Android 中的注解详细介绍_Android

注解是我们经常接触的技术,Java有注解,Android也有注解,本文将试图介绍Android中的注解,以及ButterKnife和Otto这些基于注解的库的一些工作原理. 归纳而言,Android中的注解大概有以下好处 提高我们的开发效率 更早的发现程序的问题或者错误 更好的增加代码的描述能力 更加利于我们的一些规范约束 提供解决问题的更优解 准备工作 默认情况下,Android中的注解包并没有包括在framework中,它独立成一个单独的包,通常我们需要引入这个包. dependencies

全面解析Java中的注解与注释_java

注解一.什么是 Annotation? (注解 or 注释)Annotation, 准确的翻译应该是 -- 注解. 和注释的作用完全不一样. Annotation 是JDK5.0及以后版本引入的一个特性. 与类.接口.枚举是在同一个层次,可以成为java 的一个类型. 语法是以@ 开头 简单来说, 注释是程序员对源代码的类,方法,属性等做的一些记忆或提示性描述(比如这个方法是做什么用的),是给人来看的. 注解则是Java 编译器可以理解的部分,是给编译器看的. 举个简单的例子来看一下注解的使用和

详解Java编程中Annotation注解对象的使用方法_java

注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据.  1.基本语法Java SE5内置三种标准注解 @Override:表示当前的方法定义将覆盖超类中的方法.如果你不小心拼写错误,或者方法签名对不上被覆 盖的方法,编译器就会发出错误提示 @Deprecated:如果程序员使用了注解为它的元素,那么编译器就会发出警告信息 @SupperessWarnings:关闭不当的编译器警告信息. Java SE5内置四种元注解 @Target

Android 中的注解深入探究_Android

本文系GDG Android Meetup分享内容总结文章 注解是我们经常接触的技术,Java有注解,Android也有注解,本文将试图介绍Android中的注解,以及ButterKnife和Otto这些基于注解的库的一些工作原理. 归纳而言,Android中的注解大概有以下好处 提高我们的开发效率 更早的发现程序的问题或者错误 更好的增加代码的描述能力 更加利于我们的一些规范约束 提供解决问题的更优解 准备工作 默认情况下,Android中的注解包并没有包括在framework中,它独立成一个

深入分析安卓(Android)中的注解_Android

归纳而言,Android中的注解大概有以下好处       1.提高我们的开发效率       2.更早的发现程序的问题或者错误       3.更好的增加代码的描述能力       4.更加利于我们的一些规范约束       5.提供解决问题的更优解 准备工作 默认情况下,Android中的注解包并没有包括在framework中,它独立成一个单独的包,通常我们需要引入这个包. dependencies { compile 'com.android.support:support-annotat

Java 中的注解详解及示例代码_java

在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行. 注解可以做什么 Java中的注解通常扮演以下角色 编译器指令 构建时指令 运行时指令 其中 Java内置了三种编译器指令,本文后面部分会重点介绍 Java注解可以应用在构建时,即当你构建你的项目时.构建过程包括生成源码,编译源码,生成xml文件,打包编译的源码和文件到JAR包等.软件的构建通常使用诸如Apache Ant和Mav

用ssh全注解时,在@Action中@Result注解报错

问题描述 用ssh全注解时,在@Action中@Result注解报错 import javax.annotation.Resource; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; imp

springboot源码分析14-ApplicationContextInitializer原理Springboot中PropertySource注解多环境支持以及原理

摘要:Springboot中PropertySource注解的使用一文中,详细讲解了PropertySource注解的使用,通过PropertySource注解去加载指定的资源文件.然后将加载的属性注入到指定的配置类,@value以及@ConfigurationProperties的使用.但是也遗留一个问题,PropertySource注解貌似是不支持多种环境的动态切换?这个问题该如何解决呢?我们需要从源码中看看他到底是否支持. 首先,我们开始回顾一下上节课说的PropertySource注解的

Springboot中PropertySource注解的使用

摘要:本文重点讲解一下Spring中@PropertySource注解的使用,如何通过PropertySource注解加载指定的配置文件.以及PropertySource注解与@ConfigurationProperties两个注解的配合使用. 1.1. PropertySource注解加载指定的属性文件 Spring框架提供了PropertySource注解,目的是加载指定的属性文件,接下来我们看一下如何使用该注解.首先我们定义一个配置类,并在类中添加PropertySource注解,如下所示