Json 格式在数据中较为常见,为了避免重复开发,整理了比较实用的代码片段,仅供参考。
Java 版
package com.xx.common.util;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.commons.lang.StringUtils;
public class JsonUtil {
public final static ObjectMapper objectMapper = new ObjectMapper();
static {
/**
* 如果为空则不输出
*/
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
/**
* 对于空的对象转json的时候不抛出错误
*
* 是否允许一个类型没有注解表明打算被序列化。默认true,抛出一个异常;否则序列化一个空对象,比如没有任何属性。
*/
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
/**
* 禁用序列化日期为timestamps
*
* 该特性决定是否将基于Date的值序列化为timestamp数字式的值,或者作为文本表示。
* 如果文本表示,则实际格式化的时候会调用{@link #getDateFormat}方法。
*
* 该特性可能会影响其他date相关类型的处理,虽然我们理想情况是只对date起作用。
*/
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
/**
* 禁用遇到未知属性抛出异常
*
* 该特性决定了当遇到未知属性(没有映射到属性,没有任何setter或者任何可以处理它的handler),是否应该抛出一个
* JsonMappingException异常。这个特性一般式所有其他处理方法对未知属性处理都无效后才被尝试,属性保留未处理状态。
*
* 默认情况下,该设置是被打开的。若不设置, 可以在 java class 中使用 @JsonIgnoreProperties 注解
*/
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
/**
* 视空字符传为null
*
* 该特性可以允许JSON空字符串转换为POJO对象为null。如果禁用,则标准POJO只会从JSON null或者JSON对象转换过来;
* 如果允许,则空JSON字符串可以等价于JSON null。
* @since 1.8
*/
objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
/**
* 该特性决定parser将是否允许解析使用Java/C++ 样式的注释(包括'/'+'*' 和'//' 变量)。 由于JSON标准说明书上面没有提到注释是否是合法的组成,所以这是一个非标准的特性;
* 尽管如此,这个特性还是被广泛地使用。
*
* 注意:该属性默认是false,因此必须显式允许,即通过 JsonParser.Feature.ALLOW_COMMENTS 配置为 true。
*/
objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
/**
* 允许属性名称没有引号
*
* 这个特性决定parser是否将允许使用非双引号属性名字, (这种形式在Javascript中被允许,但是JSON标准说明书中没有)。
*
* 注意:由于JSON标准上需要为属性名称使用双引号,所以这也是一个非标准特性,默认是false的。
* 同样,需要设置JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES为true,打开该特性。
*
*/
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
/**
* 允许单引号
*
* 该特性决定parser是否允许JSON字符串包含非引号控制字符(值小于32的ASCII字符,包含制表符和换行符)。 如果该属性关闭,则如果遇到这些字符,则会抛出异常。
* JSON标准说明书要求所有控制符必须使用引号,因此这是一个非标准的特性。
*
* 注意:默认时候,该属性关闭的。需要设置:JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS为true。
*/
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
/**
* 取消对非ASCII字符的转码
*/
objectMapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false);
/**
* 该特性决定parser是否允许JSON字符串包含非引号控制字符(值小于32的ASCII字符,包含制表符和换行符)。 如果该属性关闭,则如果遇到这些字符,则会抛出异常。
* JSON标准说明书要求所有控制符必须使用引号,因此这是一个非标准的特性。
*
* 注意:默认时候,该属性关闭的。需要设置:JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS 为 true。
*/
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
}
public static Map<String, Object> JsonToMap(String json) {
// jackson
Map<String, Object> map = new HashMap<String, Object>();
try {
map = objectMapper.readValue(json, new TypeReference<Map<String, Object>>(){});
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return map;
}
public static <T> T JsonToBean(String json, Class<T> clz) {
// json to javabean
T t = null;
try {
t = objectMapper.readValue(json, clz);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return t;
}
public static String JsonFindPath(String json, String path) {
String resultPath = null;
try {
JsonNode pathNode = objectMapper.readTree(json);
String[] paths = StringUtils.split(path,".");
for (int i = 0, len = paths.length; i < len; i ++ ) {
String curPath = paths[i];
if (curPath.isEmpty()) {
continue;
} else if (StringUtils.isNumeric(curPath)) {
int idxPath = java.lang.Integer.parseInt(curPath);
pathNode = pathNode.path(idxPath);
} else {
pathNode = pathNode.path(curPath);
}
}
resultPath = pathNode.toString();
} catch (IOException e) {
e.printStackTrace();
}
return resultPath;
}
public static Map<String, Object> ListMapToMap(List<Map<String, Object>> listMap) {
// 保存处理好的 Json 格式
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
Map<String, Object> formatMap;
for (int i = 0, len = listMap.size(); i < len; i ++) {
Map<String, Object> valMap = listMap.get(i);
try {
formatMap = valMap;
// 把 list map 中嵌套数据, 放到 map 中
for(Entry<String, Object> entry :formatMap.entrySet()) {
resultMap.put(entry.getKey(), entry.getValue());
}
} catch (ClassCastException e) {
System.out.println("Exception: " + valMap + " : " + e.getMessage());
}
formatMap = null;
}
} catch(Exception e) {
System.out.println("Exception: " + listMap + " : " + e.toString());
}
return resultMap;
}
}
Scala 版
package com.xx.common.util
import net.minidev.json.{JSONObject, JSONArray}
import net.minidev.json.parser.JSONParser
import scala.collection.mutable.Map
import scala.collection.JavaConversions.mapAsScalaMap
import scala.collection.JavaConversions.mutableMapAsJavaMap
object ScalaJsonUtil {
/**
* map -> json
* @param map 输入格式 mutable.Map[String,Object]
* @return
* */
def SmartMapToJson(map : Map[String, Object]): String = {
val jsonString = JSONObject.toJSONString(map)
jsonString
}
/**
* json -> Map
* @param json 输入json字符串
* @return
* */
def SmartJsonToMap(json: String): Map[String, Object] = {
val map : Map[String, Object]= Map()
if (json == null || json == "") {
return map
}
//将string转化为jsonObject
val jsonParser = new JSONParser()
try {
val jsonObj: JSONObject = jsonParser.parse(json).asInstanceOf[JSONObject]
if (jsonObj == null) {
return map
}
//获取所有键
val jsonKey = jsonObj.keySet()
val iter = jsonKey.iterator()
while (iter.hasNext){
val field = iter.next()
val value = jsonObj.get(field).toString
if(value.startsWith("{")&&value.endsWith("}")){
val value = mapAsScalaMap(jsonObj.get(field).asInstanceOf[java.util.HashMap[String, String]])
map.put(field,value)
}else{
map.put(field,value)
}
}
} catch {
case ex: Exception => return map
}
return map
}
/**
* json list map -> list string
* [{},{}] -> List[String]
*/
def SmartJsonToList(json: String): List[String] = {
var list = List[String]()
if (json == null || json == "") {
return list
}
val jsonParser = new JSONParser()
val jsonArr: JSONArray = jsonParser.parse(json).asInstanceOf[JSONArray]
for(i <- 0 to jsonArr.size() - 1) {
if(jsonArr.get(i) != null){
val node = jsonArr.get(i).toString()
list = list :+ node
}
}
return list
}
/**
* [{},{}] -> List[Map, Map]
*/
def SmartJsonToListMap(json: String): List[Map[String, Object]] = {
var listMap = List[Map[String, Object]]()
if (json == null || json == "") {
return listMap
}
val jsonParser = new JSONParser()
val jsonArr: JSONArray = jsonParser.parse(json).asInstanceOf[JSONArray]
for(i <- 0 to jsonArr.size() - 1) {
if (jsonArr.get(i) != null || jsonArr.get(i) != "" ) {
val node = SmartJsonToMap(jsonArr.get(i).toString())
if (node != null) {
listMap = listMap :+ node
}
}
}
return listMap
}
/**
* json Object -> Map
*/
def SmartGetMap(ob: Object): Map[String, Object] = {
var map = Map[String, Object]()
if (ob != null || ob != "") {
map = ob.asInstanceOf[scala.collection.mutable.Map[String, Object]];
}
map
}
def JsonListToMap(fields: String): Map[String, Object] = {
//val listStr = SmartJsonToList(fields)
val listMap = SmartJsonToListMap(fields)
//ListStrToMap(listStr)
ListMapToMap(listMap)
}
/**
* List[Json] -> Map
*/
def ListStrToMap(list: List[String]): Map[String, Object] = {
val formatMap = Map[String, Object]()
list.foreach { json =>
val map = SmartJsonToMap(json)
for ((k, v) <- map) {
formatMap.put(k, v)
}
}
formatMap
}
/**
* List[Map] -> Map
*/
def ListMapToMap(listMap: List[Map[String, Object]]): Map[String, Object] = {
val formatMap = Map[String, Object]()
listMap.foreach{ map =>
for ((k, v) <- map) {
formatMap.put(k, v)
}
}
formatMap
}
/**
* 对象转Json字符串
* @param ob 对象
* @return 字符串
*/
def objectToJson(ob: Object): String = {
var commonJson = ""
if (ob != "") {
val commonMap = SmartGetMap(ob)
commonJson = SmartMapToJson(commonMap)
}
commonJson
}
}