JSON格式与注解

JSON

JSON格式概述

JSON

JavaScript

JavaScript Object Notation

(JavaScript Object Notation,JavaScript对象表示法,读作/ˈdʒeɪsən/)是一种由道格拉斯·克罗克福特构想和设计、轻量级的数据交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。

JSON文件

{
	"firstName": "John",
	"lastName": "Smith",
	"sex": "male",
	"age": 25,
	"married": false,
	"address":
	{
		"streetAddress": "21 2nd Street",
		"city": "New York",
		"state": "NY",
		"postalCode": "10021"
	},
	"phoneNumber":
	[
		{
			"type": "home",
			"number": "212 555-1234"
		},
		{
			"type": "fax",
			"number": "646 555-4567"
		}
	]
}

数据格式

JSON对象

{
	"ID":001,
	"name":"骚磊",
	"age":16
}

特征:

  1. 数据形式键值对形式
    “键”:值
  2. 数据支持 字符串,数字,true false
  3. {} 大括号以内的数据

JSON对象数组

[
	{
		"ID":1,
		"name":"骚磊",
		"age":16
	},
	{
		"ID":2,
		"name":"骚杰",
		"age":66
	},
	{
		"ID":3,
		"name":"康康",
		"age":15
	}
]

特征:

  1. 数据使用[]包含
  2. 在[]都是JSON格式对象
  3. 每一个对象之间使用逗号隔开,同时最后一个元素不需要逗号

解析JSON格式工具

常用的工具:Gson,fastjson, Jackson
以上都是第三方工具,需要导入对应的jar包按使用XML导包

FastJson内容

JSON核心类

JSON核心类提供解析和转化方法,用于解析JSON数据格式,同时用于转换类对象到JSON格式,该类对象需要符合JavaBean规范
–| JSONArray
存在按照键值对方式解析获取数据,同时存在一定的List方法
–| JSONObject
获取对应的类对象,指定键值对对应数据的方法

解析演示

/*
完成一个符合JavaBean规范的类
*/
public class Student {
	private Strint name;
	private Integer age;
	// 这里根据需要完成对应的Setter和getter方法
}

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import jdk.nashorn.internal.ir.CallNode;
import java.util.ArrayList;
import java.util.List;
/**
* @author Anonymous
* @description FastJson演示
* @date 2020/3/9 16:34
*/
public class Demo1 {
	public static void main(String[] args) {
		ArrayList<Student> list = new ArrayList<>();
		Student stu = new Student("骚磊", 16);
		list.add(stu);
		list.add(new Student("骚杰", 66));
		list.add(new Student("老黑", 56));
		list.add(new Student("老付", 36));
		list.add(new Student("老高", 66));
		/*
		JavaBean List ==> Json String
		*/
		String s = JSON.toJSONString(list);
		System.out.println(s);
		System.out.println("--------------------------------------");
		/*
		JavaBean Student类对象 ==> Json String
		*/
		String s1 = JSON.toJSONString(stu);
		System.out.println(s1);
		/*
		Json String == Java Bean Student
		*/
		Student student = JSON.parseObject(s1, Student.class);
		System.out.println(student);
		/*
		Json String ==> Json Object
		*/
		JSONObject jsonObject = JSON.parseObject(s1);
		String name = jsonObject.getString("name");
		System.out.println(name);
		System.out.println(jsonObject.getInteger("age"));
		/*
		Json String ==> JsonArray
		*/
		JSONArray objects = JSON.parseArray(s);
		System.out.println(objects);
		for (Object object : objects) {
			JSONObject jsonObject1 = (JSONObject) object;
			System.out.println(jsonObject1.getString("name"));
			System.out.println(jsonObject1.getInteger("age"));
		}
		Student object = objects.getObject(2, Student.class);
		System.out.println(object);
		System.out.println("--------------------------------------");
		/*
		JSONArray ==> JavaBean List集合
		*/
		List<Student> students = objects.toJavaList(Student.class);
		for (Student student1 : students) {
			System.out.println(student1);
		}
		// StudentMangaer ==> ArrayList ==>JSONString ==> 文件
		// 文件 ==> 程序 ==> JSONString ==>JSONArray ==> ArrayList
		System.out.println("--------------------------------------");
	}
}

注解概述

注释: 解释代码,给程序员看

注解:
Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义Java标注,是JDK1.5之后的特征,用于说明程序,一般在框架中使用。
格式:
@AnnotationName

文档注释:
@param @return @Exeception 从根本上是一个注释,不存在代码编译,不会生成对应的.class字节码问题,只是提供给JavaDoc API文件生成工具。作为标记生成对应的文档。

注解是有一部分参与编译。
@Override并不是没编译就有效果了,是因为不管是Eclipse还是IDEA都可以预编译Java代码生成对应的.class文件的。

注解作用

生成文档:

代码中生成对应的JavaDoc API文档 @param @return

【IDEA JavaDoc工具使用参数】
Other Command Line Arguments : -encoding utf-8 -charset utf-8
解决中文乱码,因为IDEA默认编码集为UTF-8 Windows GKB

代码检查:

继承重写,或者说接口遵从之后的实现中,存在:@Override

代码数据获取: [小框架]

通过反射获取指定注解中的一些内容,例如 配置,数据,操作,验证。。。

Java中预定义的一些注解

@Override

重写/实现方法的情况下,检查方法声明是否和父类或者接口中的方法声明一致。强制格式检查。

@Deprecated

标注当前方法已过时,例如 Data日期类内的一些方法

@SuppressWarnings(“all”)

压制警告,可以用于一些代码中存在明确无异常的情况下,压制一些警告

Java中自定义注解

Java中自定义注解的方式

格式:

public @interface AnnotationName {
	属性列表; 
}

Annotation注解是可以编译得到对应的.class字节码文件,验证了注解是可以参与编译过程的。
通过反编译工具可以得到以下内容:

【Annotation本质】

public interface MyAnnotation1 extends java.lang.annotation.Annotation {
}

MyAnnotation1:
本质是一个interface,同时 java.lang.annotation.Annotation 子接口

/**
* 自定义注解!!!
* public interface MyAnnotation1 extends
*	java.lang.annotation.Annotation {
* }
*
* @author Anonymous
* @date 2020/3/10 11:01
*/
public @interface MyAnnotation1 {
	// 属性 ==> 方法形式
}

Annotation注解属性【难点】

属性:
开发书写代码使用注解的方式中,数据使用方式更加偏向于属性概念。
使用

  1. 在书写代码中使用
    @MyAnnotation(id=1, name=“骚磊”, age=16)
  2. 利用反射时,会涉及到getXXX方法
    通过属性名获取对应值的概念来完成的
    【但是实际上是利用abstract方法来完成属性概念的】

属性使用的格式[实际按照方法格式操作]

  1. 属性的值数据类型和对应具体数据 ==> 返回值类型和返回的数据

属性类型支持:

  • 基本数据类型
  • String类型
  • 其他的注解类型
  • 枚举类型:枚举就是一个带有名字的常量,为了更好的域阅读性和操作
  • 以上类型对相应的数组

属性值要求:

  • 定义属性时可以使用default关键字,加上默认值,该属性在使用的过程中是没有强制要求属性值,如果没有赋予属性值,采用对应的默认值操作,如果赋值,使用对应值。

  • 如果注解中有且只有一个value属性,或者说注解中除value属性之外,都有默认值,不管是类,方法,成员变量,包使用当前注解是可以直接在括号内加入对应数据类型数值。

  • 如果属性是数组类型, {}大括号保存,并且不同的内容,使用,隔开

    2.属性的键名字 ==> 方法的名字

元注解

给予注解的解释,用于约束注解的一些操作问题。
@Retention -
标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
RetentionPolicy.RUNTIME:

当前注解会编译生成对应的.class字节码文件,并且可以加载到JVM中,参与代码执行。

RetentionPolicy.CLASS:

RetentionPolicy.SOURCE:

注解将被编译器丢弃(该类型的注解信息只会保留在源码里,源码经过编译后,注解信息会被丢弃,
不会保留在编译好的class文件里)

@Override

对应属性RetentionPolicy.SOURCE在代码编译过程中,检查方法格式是否正确,不参与代码运行和解析。

@Documented

标记这些注解是否包含在用户文档中。是否可以通过JavaDoc工具,生成对应的API文档

@Target

标记这个注解应该是哪种 Java 成员。
属性:
	ElementType
		TYPE: 当前注解可以用于类声明
		METHOD: 当前注解可以用于方法声明位置
		FIELD:当前注解可以用于成员变量声明位置

@Inherited

标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

【重点】
@Target目标

可以作用范围 类,方法,成员变量...

@Retention

RetentionPolicy.RUNTIME 常用

版权声明:本文为weixin_42036089原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。