<commit_before>#Java 开源JSON库 - XSON

目前有很多可靠的json库，例如gson、org.json、fastjson；但是还是自己实现了一下一套完整的json流程。（之前也实现过，现在属于重构）  

[下载jar包使用](https://raw.githubusercontent.com/xcr1234/json/master/lib/json.zip)

在Maven中构建
```xml
<dependency>
  <groupId>io.github.xcr1234</groupId>
  <artifactId>xson</artifactId>
  <version>1.2</version>
</dependency>
```


##主要原理：
基于antlr框架提供的强大的词法分析和语法分析功能，书写json的文法、Listener监听器；通过antlr执行。  
整个流程为  
String/InputStream -> Lexer -> Parser -> Tree  
Walker- >Tree -> JsonObject/JsonArray  

`JsonObject`的底层其实就是一个`Map<String,Object>`（默认实现为`LinkedHashMap`）；  
而`JsonArray`的底层就是一个`List<Object>`（默认为`ArrayList<Object>`）。  

##主要方法：

**xson框架的入口类是com.xson.Json，并提供了两个非常实用的类JsonObject、JsonArray。**

序列化：

`String json = Json.toJsonString(object);`

如果一个java bean对象要被json序列化，它必须实现JsonAware、JsonObjectAware、JsonArrayAware接口任意之一，
JsonObjectAware、JsonArrayAware接口相当于是JsonAware的一个扩展。


反序列化：
如果一个java bean对象要被json库反序列化，那么它应该实现JsonBeanAware接口。
```java
JsonObject jsonObject = Json.parseObject("...");
JsonArray jsonArray = Json.parseArray("...");

VO vo = Json.parseBean("...",VO.class);
List<VO> voList = Json.parseBeanList("...",VO.class);
```

## JsonObject/JsonArray的类型转化

`JsonObject`和`JsonArray`类的getXXX方法支持自动类型转换，例如put时的value类型是int，在调用getString方法时会自动将int转换为String。

例子：

```java
jsonObject.put("num",100);
String str = jsonObject.getString("num"); //自动将int转换为String，结果为"100"
String str2 = (String)jsonObject.get("num");  //强制转换失败，抛出ClassCastException

jsonObject.put("str","100");
int num = jsonObject.getInt("str"); //自动转换为数字100.
```

如果自动转换也失败了，则会抛出`JsonCastException`。

## Java Bean对象的例子
```java
class Bean implents JsonObjectAware,JsonBeanAware{
	private int id;
	private String name;
	
	// ...
	// 省略get set 方法
	
	@Override
    public void toJson(JsonObject jsonObject, SerializeFeature feature) {
		//将bean对象的所有属性注入到JsonObject当中。
		jsonObject.put("id",id");
		jsonObject.put("name",name);
	}
	
	@Override
    public void parse(JsonObject jsonObject, DeserializeFeature feature) {
		//从JsonObject中读取出这个类的所有属性。
		this.id = jsonObject.getInt("id");
		this.name = jsonObject.getString("name");
	}
	
}

```<commit_msg>implements<commit_after>#Java 开源JSON库 - XSON

目前有很多可靠的json库，例如gson、org.json、fastjson；但是还是自己实现了一下一套完整的json流程。（之前也实现过，现在属于重构）  

[下载jar包使用](https://raw.githubusercontent.com/xcr1234/json/master/lib/json.zip)

在Maven中构建
```xml
<dependency>
  <groupId>io.github.xcr1234</groupId>
  <artifactId>xson</artifactId>
  <version>1.2</version>
</dependency>
```


##主要原理：
基于antlr框架提供的强大的词法分析和语法分析功能，书写json的文法、Listener监听器；通过antlr执行。  
整个流程为  
String/InputStream -> Lexer -> Parser -> Tree  
Walker- >Tree -> JsonObject/JsonArray  

`JsonObject`的底层其实就是一个`Map<String,Object>`（默认实现为`LinkedHashMap`）；  
而`JsonArray`的底层就是一个`List<Object>`（默认为`ArrayList<Object>`）。  

##主要方法：

**xson框架的入口类是com.xson.Json，并提供了两个非常实用的类JsonObject、JsonArray。**

序列化：

`String json = Json.toJsonString(object);`

如果一个java bean对象要被json序列化，它必须实现JsonAware、JsonObjectAware、JsonArrayAware接口任意之一，
JsonObjectAware、JsonArrayAware接口相当于是JsonAware的一个扩展。


反序列化：
如果一个java bean对象要被json库反序列化，那么它应该实现JsonBeanAware接口。
```java
JsonObject jsonObject = Json.parseObject("...");
JsonArray jsonArray = Json.parseArray("...");

VO vo = Json.parseBean("...",VO.class);
List<VO> voList = Json.parseBeanList("...",VO.class);
```

## JsonObject/JsonArray的类型转化

`JsonObject`和`JsonArray`类的getXXX方法支持自动类型转换，例如put时的value类型是int，在调用getString方法时会自动将int转换为String。

例子：

```java
jsonObject.put("num",100);
String str = jsonObject.getString("num"); //自动将int转换为String，结果为"100"
String str2 = (String)jsonObject.get("num");  //强制转换失败，抛出ClassCastException

jsonObject.put("str","100");
int num = jsonObject.getInt("str"); //自动转换为数字100.
```

如果自动转换也失败了，则会抛出`JsonCastException`。

## Java Bean对象的例子
```java
class Bean implements JsonObjectAware,JsonBeanAware{
	private int id;
	private String name;
	
	// ...
	// 省略get set 方法
	
	@Override
    public void toJson(JsonObject jsonObject, SerializeFeature feature) {
		//将bean对象的所有属性注入到JsonObject当中。
		jsonObject.put("id",id");
		jsonObject.put("name",name);
	}
	
	@Override
    public void parse(JsonObject jsonObject, DeserializeFeature feature) {
		//从JsonObject中读取出这个类的所有属性。
		this.id = jsonObject.getInt("id");
		this.name = jsonObject.getString("name");
	}
	
}

```
{'fraction_non_alphanumeric': 0.15139442231075698, 'fraction_numerical': 0.010780407780642137, 'mean_word_length': 6.345955249569707, 'pattern_counts': {'":': 0, '<': 27, '<?xml version=': 0, '>': 37, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 2}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3970515', 'n_tokens_mistral': 2011, 'n_tokens_neox': 2044, 'n_words': 212}