Skip to content

Commit

Permalink
1.2.0 version update
Browse files Browse the repository at this point in the history
  • Loading branch information
kongzue committed Jun 12, 2023
1 parent 2c844aa commit 95f0d86
Show file tree
Hide file tree
Showing 13 changed files with 509 additions and 43 deletions.
Binary file removed .gradle/6.7.1/fileChanges/last-build.bin
Binary file not shown.
Binary file removed .gradle/6.7.1/fileHashes/fileHashes.bin
Binary file not shown.
Binary file removed .gradle/6.7.1/fileHashes/fileHashes.lock
Binary file not shown.
Empty file removed .gradle/6.7.1/gc.properties
Empty file.
4 changes: 2 additions & 2 deletions .gradle/buildOutputCleanup/cache.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#Thu May 13 20:17:01 CST 2021
gradle.version=6.7.1
#Mon Apr 03 19:49:52 CST 2023
gradle.version=7.3.3
2 changes: 1 addition & 1 deletion .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

127 changes: 126 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# BaseJson

基于 org.json 的改进型 Json 解析库,快速解析 Json 为 Map 或 List 对象。

<a href="https://github.com/kongzue/BaseJson/">
Expand All @@ -18,6 +19,7 @@
</a>

## 简介

- 将 Json 转换为 Map 或 List 的子类,可直接用于 Adapter,省去编写 Bean 的过程。
- JsonMap 也可轻松与 JavaBean 互相转换。
- 高容错设计,使用自定义 get 方法,无论如何绝不会出现空指针,哪怕类型错误,你也无须担心空指针异常;
Expand All @@ -29,6 +31,7 @@
### jitPack

在项目根目录的 build.gradle(Project) 添加:

```
allprojects {
repositories {
Expand All @@ -45,20 +48,23 @@ allprojects {
</a>

在 build.gradle(app) 添加:

```
dependencies {
implementation 'com.github.kongzue:BaseJson:1.0.7.2'
implementation 'com.github.kongzue:BaseJson:1.2.0'
}
```

#### jCenter(已停止服务):

在dependencies{}中添加引用:

```
implementation 'com.kongzue.basejson:basejson:1.0.7'
```

## 概念

本组件对 Json 的定义如下:

对于 Json 对象,为 JsonMap,对于 Json 集合,为 JsonList。
Expand All @@ -74,28 +80,34 @@ JsonMap 是 Map 的子类,JsonList 是 List 的子类,本身各自具备 Map
## 由 String 创建 JsonMap/JsonList

使用以下代码将 Json 文本解析为 JsonMap:

```
JsonMap data = new JsonMap("{\"key\":\"DFG1H56EH5JN3DFA\",\"token\":\"124ASFD53SDF65aSF47fgT211\"}");
```

使用以下代码将 Json 文本解析为 JsonList:

```
JsonList list = new JsonList("[{\"answerId\":\"98\",\"questionDesc\":\"否\"},{\"answerId\":\"99\",\"questionDesc\":\"是\"}]");
```

若 Json 文本不合法,或内容有错误,则可能返回 **空内容** 的 JsonMap/JsonList。

## 读取值

使用 JsonMap 和 JsonList 定义的 getString(key)、getBoolean(key) 等方法不会读取空指针。

即,对于以下 Json:

```
{
"key":"DFG1H56EH5JN3DFA",
"token":"124ASFD53SDF65aSF47fgT211"
}
```

若执行:

```
JsonMap data = JsonMap.parse("{\"key\":\"DFG1H56EH5JN3DFA\",\"token\":\"124ASFD53SDF65aSF47fgT211\"}");
Expand All @@ -104,14 +116,18 @@ String name = data.getString("name"); //显然,这段 json
JsonMap data = data.getJsonMap("data"); //这段 json 中没有名为“data”的子 json 对象
String age = data.getJsonMap("data").getInt("age"); //更不可能有“data”下的值“age”
```

上述 get 方法均不会报空指针错误,而是会获得该类型的默认空值,即:

```
key = "DFG1H56EH5JN3DFA"
name = ""
data = new JsonMap() //返回空的 JsonMap 对象,可使用 isEmpty() 判空
age = 0
```

对于默认状态可能为 0 的 int 类型的值,或本身可能为 "" 的 String 类型的值,可以使用如下方法来设置 defaultValue:

```
String name = data.getString("name", "zhangsan"); //若该字段为空,则返回 “zhangsan”
String age = data.getJsonMap("data").getInt("age", -1); //若该字段为空,则返回 -1
Expand All @@ -122,6 +138,7 @@ String age = data.getJsonMap("data").getInt("age", -1); //若该字段为空
#### 在 JsonList 中查找

对于 JsonList,要寻找其中**含有**已知 key=value 的 JsonMap,可使用 `.findJsonMap(key, value)` 来寻找其中符合结果的 JsonMap,例如:

```java
//查找某个符合 key=value 的结果:
JsonMap result = jsonList.findJsonMap("key", "value");
Expand All @@ -132,8 +149,28 @@ jsonList.findJsonMap("key", "value")
.set("age", 3);
```

#### JsonList 数据预处理

当 JsonList 的数据全都是 JsonMap,且需要对 JsonMap 的数据内容进行预处理,那么可以通过以下方法实现:

```java
JsonList list = ...;
list.preprocessedJsonMapData(new JsonMapPreprocessingEvents() {
@Override
public JsonMap processingData(JsonMap originData) {
originData.set("goods_price_str", "¥" + originData.getString("goods_price"));
return originData;
}
});
System.out.println(list.toString());
```

上述代码会将 JsonList 中每个 JsonMap 的 `goods_price` 字段读取,并设置一个新的字段:`goods_price_str` ,使其值等于 "¥" + `goods_price`

## 当 Json 存在问题

对于如下异常情况,也可以放心使用:

```
{
"key":"DFG1H56EH5JN3DFA",
Expand All @@ -145,7 +182,9 @@ jsonList.findJsonMap("key", "value")
"signed":"true",
}
```

对于上述 Json,与服务端约定 data 应为 Json 对象而非集合、name 应该有值但给出为 null、age 和 signed 的类型不对,使用本框架按照以下代码,依然能够正常解析:

```
String name = data.getString("name"); //返回 “” 空值
JsonMap data = data.getJsonMap("data"); //返回空的 JsonMap 对象,可使用 isEmpty() 判空
Expand All @@ -156,14 +195,17 @@ String list = data.getList("list")
.getJsonMap(0)
.getInt("limitMoney"); //返回 26
```

可见,在 BaseJson 中,类型并不是绝对的,不同类型可以进行“软”转换,以获得最符合预期的解析结果。

你无需担心任何来自后端的异常情况,使用 BaseJson 解析都可以保证绝对不会出现空指针异常。

## 输出 Json 文本

你可以手动创建 JsonMap 或 JsonList,或使用现有的 Map、List 对象构建 JsonMap、JsonList。

使用相应的`set(...)`方法添加值,然后使用`toString()`方法构建 Json 文本。

```
JsonMap data = ...;
String jsonObj = data.toString();
Expand All @@ -178,9 +220,11 @@ String jsonObj = data.toString();
### 由 JsonMap 转换为 JavaBean

例如现在已经有一个 JavaBean 对象 User,以及对应的数据 jsonMap,则:

```
User user = JsonBean.getBean(jsonMap, User.class);
```

即可将 jsonMap 中的数据对应到 User 类中。

请注意,JavaBean 对象中必须包含每个属性的对应 get、set 方法,且必须使用驼峰命名规则。
Expand All @@ -190,12 +234,92 @@ User user = JsonBean.getBean(jsonMap, User.class);
### 由 JavaBean 转换为 JsonMap

此时已经有一个设置好数据的 User 对象 user,要转换为 JsonMap:

```
JsonMap userJson = JsonBean.setBean(user);
```

转换后即可获得 JsonMap 对象。

## 由 JsonList 直接生成适配器 Adapter

可以使用 JsonList 的方法直接生成可用于列表等组件的适配器 JsonListAdapter,也可以通过构造方法构建。

JsonListAdapter 旨在帮助开发者快速并轻松的完成网络请求下来的 json 数据集到界面 UI 构建的过程,只需要对应好 json 数据集(JsonList)中每个 json 数据(JsonMap)中的键值对中的键(key),与制作布局时为其对应的 View 设置好一样的 `android:tag` 属性,即可完成数据对应绑定显示到 UI。

JsonListAdapter 只需要指定上下文(context)、列表项布局资源ID(layoutResId)以及数据集(JsonList)即可自动根据 JsonList 的元素 JsonMap 中 key 对应在列表项布局中对应 tag 的 View 进行关系绑定,并直接为其赋值。

> **TextView 自动绑定:**
> 当数据为 String 时自动设置 setText;当数据为 int 时自动调用并设置为文本资源
> **ImageView 自动绑定:**
> 当数据为 int 时自动调用并设置为图像资源;当数据为 String 时自动设置图像 Uri;
其它 View 或者具有自定义方法的情况可以使用重写 JsonListAdapter#bindEvents、或者使用 jsonListAdapter.setEvents(JsonListAdapterEvents#bindEvents) 来实现,例如:

```java
JsonListAdapter adapter = new JsonListAdapter(me, R.layout.item_my_order_list, orderList) {
/**
* 绑定事件
* 除非你要在列表项中处理某些控件的事务,例如单独指定 setOnClickListener,不然不建议使用
* 原则就是能尽量少的干涉执行过程就尽量少干涉,能提前预处理好就提前预处理好,
* 别搁运行过程中呼啦啦搞一大堆的逻辑处理,不然不卡你卡谁
*
* @param context 上下文
* @param itemView 列表项根布局
* @param viewHolder 所有子布局
* @param data 数据
* @param index 索引
* @param dataList 数据集
*/
@Override
public void bindEvents(Context context, View itemView, JsonListAdapter.ViewHolder viewHolder, JsonMap data, int index, JsonList dataList) {
//...
}
};

listView.setAdapter(adapter);
```

还有两个事件可供重写:

```java
/**
* 预处理数据
* 但不建议使用,更推荐在数据加载后,在网络请求或异步线程中完成所有数据的预处理,
* 否则可能带来列表滑动过程的卡顿和性能问题。
*
* @param context 上下文
* @param itemView 列表项根布局
* @param viewHolder 所有子布局
* @param data 数据
* @param index 索引
* @param dataList 数据集
* @return 处理完的数据
*/
JsonMap preprocessedData(Context context, View itemView, JsonListAdapter.ViewHolder viewHolder, JsonMap data, int index, JsonList dataList);

/**
* 设置数据
* 我们已经预设了两种数据自动绑定的场景:例如,TextView 自动绑定:
* {当数据为 String 时自动设置 setText;当数据为 int 时自动调用并设置为文本资源}
* ImageView 自动绑定:
* {当数据为 int 时自动调用并设置为图像资源;当数据为 String 时自动设置图像 Uri;}
* 上述过程都是自动支持的,如果你有特殊需求或者其它组件需要设置,可以重写以下方法进行处理
*
* @param context 上下文
* @param tag 子布局 view 的标签
* @param view 子布局
* @param data 数据
* @param index 索引
* @param dataList 数据集
*/
void setData(Context context, String tag, View view, JsonMap data, int index, JsonList dataList);
```

上述方法也可以通过 `adapter.setEvents(JsonListAdapterEvents)` 接口来完成设置。

## 开源协议

```
Copyright Kongzue BaseJson
Expand All @@ -211,6 +335,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```

## 更新日志

请前往 [Release Page](https://github.com/kongzue/BaseJson/releases) 查看
5 changes: 3 additions & 2 deletions basejson/build.gradle
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
apply plugin: 'com.android.library'

android {
compileSdkVersion 30

defaultConfig {
minSdkVersion 14
//noinspection ExpiredTargetSdkVersion
targetSdkVersion 30
versionCode 12
versionName "1.1.2"
versionCode 13
versionName "1.2.0"
}

buildTypes {
Expand Down
Loading

0 comments on commit 95f0d86

Please sign in to comment.