Java 中 JSON 的使用

JSON for java入门总结

Java中并没有内置JSON的解析,因此使用JSON需要借助第三方类库。

下面是几个常用的 JSON 解析类库:

Gson: 谷歌开发的 JSON 库,功能十分全面。
FastJson: 阿里巴巴开发的 JSON 库,性能十分优秀。
Jackson: 社区十分活跃且更新速度很快。

FastJson

Fastjson 简明教程
Fastjson 中文 Wiki

1. 什么是fastjson?

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

2.fastjson的优点

2.1 速度快

fastjson相对其他JSON库的特点是快,从2011年fastjson发布1.1.x版本之后,其性能从未被其他Java实现的JSON库超越。
2.2 使用广泛

fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。
2.3 测试完备

fastjson有非常多的testcase,在1.2.11版本中,testcase超过3321个。每次发布都会进行回归测试,保证质量稳定。
2.4 使用简单

fastjson的API十分简洁。

String text = JSON.toJSONString(obj); //序列化
VO vo = JSON.parseObject("{...}", VO.class); //反序列化

2.5 功能完备

支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。

Fastjson 特性

  • 提供服务器端、安卓客户端两种解析工具,性能表现较好。

  • 提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON
    相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON
    字符串转换成对象。

  • 允许转换预先存在的无法修改的对象(只有class、无源代码)。

  • Java泛型的广泛支持。

  • 允许对象的自定义表示、允许自定义序列化类。

  • 支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)。

fastjson的最佳实践

1、依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>

根据需要使用特定版本,建议使用最新版本。

fastjson常用方法

//此方法将指定的对象序列化为其等效的Json表示
//如果您想将对象写入到Writer,请使用writeJSONString(Writer, object, SerializerFeature[])。
public static String toJSONString(Object object)


2、 序列化一个对象成JSON字符串

User user = new User();
user.setName("校长");
user.setAge(3);
user.setSalary(new BigDecimal("123456789.0123"));
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);
// 输出 {"age":3,"name":"校长","old":false,"salary":123456789.0123}

3、 反序列化一个JSON字符串成Java对象


 String jsonString = "{\"age\":3,\"birthdate\":1496738822842,\"name\":\"校长\",\"old\":true,\"salary\":123456789.0123}";
 User u = JSON.parseObject(jsonString ,User.class);
 System.out.println(u.getName());
 // 输出 校长

String jsonStringArray = "[{\"age\":3,\"birthdate\":1496738822842,\"name\":\"校长\",\"old\":true,\"salary\":123456789.0123}]";
List<User> userList = JSON.parseArray(jsonStringArray, User.class);
System.out.println(userList.size());
// 输出 1

4、 日期格式处理
Fastjson能识别下面这么多种日期格式的字符串:

private final static String            defaultPatttern    = "yyyy-MM-dd HH:mm:ss";
private final static DateTimeFormatter defaultFormatter   = DateTimeFormatter.ofPattern(defaultPatttern);
private final static DateTimeFormatter formatter_dt19_tw  = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
private final static DateTimeFormatter formatter_dt19_cn  = DateTimeFormatter.ofPattern("yyyy年M月d日 HH:mm:ss");
private final static DateTimeFormatter formatter_dt19_cn_1  = DateTimeFormatter.ofPattern("yyyy年M月d日 H时m分s秒");
private final static DateTimeFormatter formatter_dt19_kr  = DateTimeFormatter.ofPattern("yyyy년M월d일 HH:mm:ss");
private final static DateTimeFormatter formatter_dt19_us  = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
private final static DateTimeFormatter formatter_dt19_eur = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
private final static DateTimeFormatter formatter_dt19_de  = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");
private final static DateTimeFormatter formatter_dt19_in  = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");

private final static DateTimeFormatter formatter_d8       = DateTimeFormatter.ofPattern("yyyyMMdd");
private final static DateTimeFormatter formatter_d10_tw   = DateTimeFormatter.ofPattern("yyyy/MM/dd");
private final static DateTimeFormatter formatter_d10_cn   = DateTimeFormatter.ofPattern("yyyy年M月d日");
private final static DateTimeFormatter formatter_d10_kr   = DateTimeFormatter.ofPattern("yyyy년M월d일");
private final static DateTimeFormatter formatter_d10_us   = DateTimeFormatter.ofPattern("MM/dd/yyyy");
private final static DateTimeFormatter formatter_d10_eur  = DateTimeFormatter.ofPattern("dd/MM/yyyy");
private final static DateTimeFormatter formatter_d10_de   = DateTimeFormatter.ofPattern("dd.MM.yyyy");
private final static DateTimeFormatter formatter_d10_in   = DateTimeFormatter.ofPattern("dd-MM-yyyy");

private final static DateTimeFormatter ISO_FIXED_FORMAT =
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());

private final static String formatter_iso8601_pattern     = "yyyy-MM-dd'T'HH:mm:ss";
private final static DateTimeFormatter formatter_iso8601  = DateTimeFormatter.ofPattern(formatter_iso8601_pattern);

默认序列化Date输出使用”yyyy-MM-dd HH:mm:ss”格式,可以用UseISO8601DateFormat特性换成”yyyy-MM-dd’T’HH:mm:ss”格式。

JSON.defaultTimeZone = TimeZone.getTimeZone("Asia/Shanghai");
JSON.defaultLocale = Locale.US;
        
public static class Model {
        @JSONField(format = "MMM dd, yyyy h:mm:ss aa")
        private java.util.Date date;

        public java.util.Date getDate() {
            return date;
        }

        public void setDate(java.util.Date date) {
            this.date = date;
        }

        @JSONField(format = "MMM-dd-yyyy h:mm:ss aa")
        public java.sql.Date date2;
}

5、 常见序列化特性的使用
Fastjson的序列化特性定义在枚举类com\alibaba\fastjson\serializer\SerializerFeature.java中,目前正好有30项。
可以通过设置多个特性到FastjsonConfig中全局使用,也可以在某个具体的JSON.writeJSONString时作为参数使用。

    QuoteFieldNames, //key使用引号
    UseSingleQuotes, //使用单引号
    WriteMapNullValue, //输出Map的null值
    WriteEnumUsingToString, //枚举属性输出toString的结果
    WriteEnumUsingName, //枚举数据输出name
    UseISO8601DateFormat, //使用日期格式
    WriteNullListAsEmpty, //List为空则输出[]
    WriteNullStringAsEmpty, //String为空则输出””
    WriteNullNumberAsZero, //Number类型为空则输出0
    WriteNullBooleanAsFalse, //Boolean类型为空则输出false
    SkipTransientField,
    SortField, //排序字段
    WriteTabAsSpecial,
    PrettyFormat, // 格式化JSON缩进
    WriteClassName, // 输出类名
    DisableCircularReferenceDetect, // 禁止循环引用
    WriteSlashAsSpecial, // 对斜杠’/’进行转义
    BrowserCompatible,
    WriteDateUseDateFormat, // 全局修改日期格式,默认为false。
    //JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
    NotWriteRootClassName,
    DisableCheckSpecialChar,
    BeanToArray,
    WriteNonStringKeyAsString,
    NotWriteDefaultValue,
    BrowserSecure,
    IgnoreNonFieldGetter,
    WriteNonStringValueAsString,
    IgnoreErrorGetter,
    WriteBigDecimalAsPlain,
    MapSortField

使用示例如下

Word word = new Word();
word.setA("a");
word.setB(2);
word.setC(true);
word.setD("d");
word.setE("");
word.setF(null);
word.setDate(new Date());

System.out.println(JSON.toJSONString(word));
System.out.println(JSON.toJSONString(word, SerializerFeature.PrettyFormat,
    SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty,
    SerializerFeature.DisableCircularReferenceDetect,
    SerializerFeature.WriteNullListAsEmpty));

6、 Annotation注解的使用

  1. JSONField

可以配置在getter/setter方法或者字段上
详情参见此处:JSONField用法

package com.alibaba.fastjson.annotation;

public @interface JSONField {
    // 配置序列化和反序列化的顺序,1.1.42版本之后才支持
    int ordinal() default 0;

     // 指定字段的名称
    String name() default "";

    // 指定字段的格式,对日期格式有用
    String format() default "";

    // 是否序列化
    boolean serialize() default true;

    // 是否反序列化
    boolean deserialize() default true;
}

注意:1、若属性是私有的,必须有set*方法。否则无法反序列化。

缺省fastjson序列化一个java bean,是根据fieldName的字母序进行序列化的,你可以通过ordinal指定字段的顺序。这个特性需要1.1.42以上版本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java,可以使用Jackson库来处理JSON数据。使用Jackson库可以将JSON字符串转换为Java对象,也可以将Java对象转换为JSON字符串。 如果要使用Jackson的streaming API来处理JSON数据,需要先创建JsonFactory实例,然后使用该实例创建JsonParser或JsonGenerator。 例如,以下代码展示了如何使用JsonParser读取JSON数据: ``` JsonFactory jsonFactory = new JsonFactory(); JsonParser jsonParser = jsonFactory.createParser(jsonString); while (jsonParser.nextToken() != null) { // do something with the token } jsonParser.close(); ``` 另外,配合Gson等库使用效果更佳. ### 回答2: 在Java使用JSON时,可以使用流(Stream)来处理JSON数据。 首先,在Java,可以使用第三方库(如Jackson、Gson等)来处理JSON数据。这些库提供了一系列的API和工具,可以方便地将JSON数据转换为Java对象及Java对象转换为JSON数据。 使用流(Stream)的方式可以更加高效地处理JSON数据。可以使用字节流(InputStream/OutputStream)或字符流(Reader/Writer)来读取和写入JSON数据。 对于读取JSON数据,可以使用InputStream或Reader来读取JSON数据源(如文件、网络请求等),然后通过JSON库提供的API将其解析成Java对象。例如,可以使用JsonParser类来解析JSON数据,并将其转换为Java对象。 对于写入JSON数据,可以使用OutputStream或Writer来将Java对象转换为JSON数据,并将其写入到指定目标(如文件、网络请求等)。例如,可以使用JsonGenerator类来生成JSON数据,并使用OutputStream或Writer将其写入到指定的位置。 在处理JSON数据时,还可以使用流的链式调用来进行一系列的操作,以便更灵活地处理数据。例如,可以通过流式操作将JSON数据源转换为Java对象,然后对其进行过滤、映射、排序等操作,最后将结果转换为JSON数据。 总之,使用流(Stream)的方式可以更高效、灵活地处理JSON数据。通过选择合适的JSON库和使用流式操作,可以更好地利用Java语言的特性来处理JSON数据。 ### 回答3: 在Java,可以使用Jackson库来处理JSON数据流。Jackson是一个流行的处理JSON数据的Java库,提供了丰富的API和功能。 首先,需要引入Jackson库的依赖。可以使用Maven或Gradle等构建工具来添加以下依赖: ``` <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.12.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.2</version> </dependency> ``` 接下来,可以使用`JsonFactory`类和`JsonParser`类来创建和解析JSON数据流。以下是一个简单的示例代码: ```java import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import java.io.IOException; public class JsonStreamExample { public static void main(String[] args) { String json = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; JsonFactory factory = new JsonFactory(); try (JsonParser parser = factory.createParser(json)) { while (!parser.isClosed()) { JsonToken token = parser.nextToken(); if (JsonToken.FIELD_NAME.equals(token)) { String fieldName = parser.getCurrentName(); token = parser.nextToken(); String fieldValue = parser.getValueAsString(); System.out.println(fieldName + ": " + fieldValue); } } } catch (IOException e) { e.printStackTrace(); } } } ``` 在上面的示例,我们创建了一个JSON数据流的解析器,并使用`JsonToken`来遍历JSON数据流的字段名和字段值。可以根据需要使用不同的`JsonToken`来处理不同类型的JSON值。 除了解析JSON数据流外,Jackson还提供了一系列对象映射的功能,可以将JSON数据流转换成Java对象,或将Java对象转换成JSON数据流。可以使用`ObjectMapper`类实现这些功能。 总之,通过使用Jackson库提供的API和功能,我们可以轻松地在Java处理和操作JSON数据流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值