package com.dayu.general.net
|
|
import android.text.TextUtils
|
import com.google.gson.Gson
|
import com.google.gson.GsonBuilder
|
import com.google.gson.JsonParser
|
import com.google.gson.LongSerializationPolicy
|
import org.json.JSONArray
|
import org.json.JSONException
|
import org.json.JSONObject
|
import java.lang.reflect.ParameterizedType
|
import java.lang.reflect.Type
|
import java.util.*
|
|
/**
|
* Description: JSON解析工具类
|
* Author: zuo
|
* Date: 2025/3/7
|
*/
|
class MyJsonParser {
|
|
companion object {
|
/**
|
* 获取Json字符串中的属性值
|
*/
|
@JvmStatic
|
@Throws(JSONException::class)
|
fun getPropertyFromJson(json: String, attrName: String): Any? {
|
return try {
|
val jsonObject = JSONObject(json)
|
jsonObject.get(attrName)
|
} catch (e: JSONException) {
|
null
|
}
|
}
|
|
/**
|
* 将对象转换成Json字符串
|
*/
|
@JvmStatic
|
fun <T> bean2Json(t: T?): String {
|
return try {
|
if (t == null || TextUtils.isEmpty(t.toString())) return ""
|
Gson().toJson(t)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
""
|
}
|
}
|
|
/**
|
* 转换为T类型
|
*/
|
@JvmStatic
|
fun <T> json2Bean(json: String, tClass: Class<T>): T? {
|
return try {
|
if (!TextUtils.isEmpty(json)) {
|
Gson().fromJson(json, tClass)
|
} else null
|
} catch (e: Exception) {
|
e.printStackTrace()
|
null
|
}
|
}
|
|
/**
|
* 将Json直接序列化为List
|
*/
|
@JvmStatic
|
fun <T> json2List(json: String, type: Type): List<T>? {
|
return try {
|
if (!TextUtils.isEmpty(json)) {
|
Gson().fromJson(json, type)
|
} else null
|
} catch (e: Exception) {
|
e.printStackTrace()
|
null
|
}
|
}
|
|
private fun buildGson() = GsonBuilder().create()
|
|
@JvmStatic
|
fun <T> getBeanFromJson(json: String, cl: Class<T>): T? {
|
return try {
|
buildGson().fromJson(json, cl)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
null
|
}
|
}
|
|
@JvmStatic
|
fun <T> getBeanFromJson(json: String, cl: Type): T? {
|
return try {
|
buildGson().fromJson(json, cl)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
null
|
}
|
}
|
|
@JvmStatic
|
fun <T> getBeanFromMap(map: Map<String, Any>, cl: Class<T>): T? {
|
return getBeanFromJson(getJsonFromMap(map), cl)
|
}
|
|
@JvmStatic
|
fun getJsonFromMap(params: Map<String, Any>?): String {
|
if (params.isNullOrEmpty()) return ""
|
return getJSONObjectFromMap(params).toString()
|
}
|
|
@JvmStatic
|
fun getJsontoMap(params: Map<*, *>): String {
|
return GsonBuilder()
|
.setLongSerializationPolicy(LongSerializationPolicy.STRING)
|
.serializeSpecialFloatingPointValues()
|
.create()
|
.toJson(params)
|
}
|
|
@JvmStatic
|
fun <T> getJsonbyList(params: List<T>): String {
|
return Gson().toJson(params)
|
}
|
|
@Suppress("UNCHECKED_CAST")
|
private fun getJSONObjectFromMap(params: Map<String, Any>): JSONObject {
|
val jsonObject = JSONObject()
|
for ((key, value) in params) {
|
try {
|
when (value) {
|
is List<*> -> {
|
if (value.isNotEmpty()) {
|
val array = JSONArray()
|
for (o in value) {
|
when (o) {
|
is Map<*, *> -> array.put(getJSONObjectFromMap(o as Map<String, Any>))
|
is List<*> -> {
|
val array1 = JSONArray()
|
array1.put(getListFromJson(o.toString()))
|
array.put(array1)
|
}
|
else -> array.put(o)
|
}
|
}
|
jsonObject.put(key, array)
|
}
|
}
|
is Map<*, *> -> jsonObject.put(key, getJSONObjectFromMap(value as Map<String, Any>))
|
else -> jsonObject.put(key, value)
|
}
|
} catch (e: JSONException) {
|
e.printStackTrace()
|
}
|
}
|
return jsonObject
|
}
|
|
@JvmStatic
|
fun getMapFromJson(jsonStr: String?): HashMap<String, Any> {
|
val valueMap = LinkedHashMap<String, Any>()
|
if (jsonStr.isNullOrEmpty()) return valueMap
|
|
try {
|
val jsonObject = JSONObject(jsonStr)
|
return getMapFromJsonObject(jsonObject)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
return valueMap
|
}
|
|
@JvmStatic
|
fun getListFromJsonArray(jsonArray: JSONArray): List<Any> {
|
val list = ArrayList<Any>()
|
try {
|
for (i in 0 until jsonArray.length()) {
|
when (val obj = jsonArray.get(i)) {
|
is JSONObject -> list.add(getMapFromJsonObject(obj))
|
is JSONArray -> list.add(getListFromJsonArray(jsonArray))
|
else -> {
|
if (obj != null && !TextUtils.isEmpty(obj.toString()) && obj.toString() != "null") {
|
list.add(obj)
|
}
|
}
|
}
|
}
|
} catch (e: JSONException) {
|
e.printStackTrace()
|
}
|
return list
|
}
|
|
@JvmStatic
|
fun getMapFromJsonObject(jsonObj: JSONObject): HashMap<String, Any> {
|
val map = LinkedHashMap<String, Any>()
|
val keys = jsonObj.keys()
|
try {
|
while (keys.hasNext()) {
|
val key = keys.next()
|
when (val obj = jsonObj.get(key)) {
|
is JSONArray -> map[key] = getListFromJsonArray(obj)
|
is JSONObject -> map[key] = getMapFromJsonObject(obj)
|
is Number -> map[key] = obj.toString()
|
else -> {
|
if (obj != null && !TextUtils.isEmpty(obj.toString()) && obj.toString() != "null") {
|
map[key] = obj
|
}
|
}
|
}
|
}
|
} catch (e: JSONException) {
|
e.printStackTrace()
|
}
|
return map
|
}
|
|
@JvmStatic
|
fun <T> getListFromJson(str: String, clazz: Class<T>): List<T>? {
|
return try {
|
val type = ParameterizedTypeImpl(clazz)
|
Gson().fromJson<List<T>>(str, type)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
null
|
}
|
}
|
|
@JvmStatic
|
fun <T> getListByJson(json: String, cls: Class<T>): List<T> {
|
val gson = Gson()
|
val list = ArrayList<T>()
|
val array = JsonParser().parse(json).asJsonArray
|
array.forEach { elem ->
|
list.add(gson.fromJson(elem, cls))
|
}
|
return list
|
}
|
|
@JvmStatic
|
fun getListFromJson(str: String): List<Any>? {
|
try {
|
val jsonArray = JSONArray(str)
|
return getListFromJsonArray(jsonArray)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
return null
|
}
|
|
private class ParameterizedTypeImpl(private val clazz: Class<*>) : ParameterizedType {
|
override fun getActualTypeArguments(): Array<Type> = arrayOf(clazz)
|
override fun getRawType(): Type = List::class.java
|
override fun getOwnerType(): Type? = null
|
}
|
}
|
}
|