java解析任意层数json字符串的方法

代码如下:

//解析策略,有可能是解析json字符串,有可能为数据中的图片地址,email等
package cc.util.regex;

public enum RegexPolicy {
 Json("Json"),
 Image("ImageFromHtml");

private String value;
 RegexPolicy (String value) {
  this.value = value;
 }

@Override
 public String toString() {
  // TODO Auto-generated method stub
  return value;
 }
}

package cc.util.regex;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;

/**
 * A static Class help to Analyze data
 * @author wangcccong
 * @version 1.140122
 * create at: 14-02-14
 */
public class RegexUtil {
 //与解析策略相匹配的正则表达式
 //private static final String REGULAR_IMG_HTML = "<img +?src=\"(.+?)\"";
 private static final String REGULAR_JSON_ITEM_NAME = "\"([^\\\" ]+?)\":";
 //private static final String REGULAR_JSON_ARRAY_NAME = ", *?\" *?([a-zA-Z0-9]*?) *?\" *?: *?\\[ *?\\{";

//公用方法解析,将字符串传入即可
 public static Object regex(final RegexPolicy policy, final String data) {
  switch (policy) {
  case Json:
   return regexJson(data);
  case Image:
   break;
  default:
   break;
  }
  return null;
 }

/**
  *      By recursively parse the Json string, obtain the Json string name by the regular expression,
  * see also Matcher and Pattern and analysis of data. If the analytical data JsonObject object return key value pair (Map),
  *  if JsonArray List is returned, otherwise it returns String.
  *  <br><b>Notice:</b> if return Map you should better invoke map.get(null) to obtain value.
  * @see {@link java.util.regex.Matcher}, {@link java.util.regex.Pattern}
  * @param jsonStr
  * @return {@link java.util.Map} or {@link java.util.List} or {@link java.lang.String}
  */
 private static Object regexJson(final String jsonStr) {
  if (jsonStr == null) throw new NullPointerException("JsonString shouldn't be null");
  try {
   if (isJsonObject(jsonStr)) {
    final Pattern pattern = Pattern.compile(REGULAR_JSON_ITEM_NAME);
    final Matcher matcher = pattern.matcher(jsonStr);
    final Map<String, Object> map = new HashMap<String, Object>();
    final JSONObject jsonObject = new JSONObject(jsonStr);
    for ( ; matcher.find(); ) {
     String groupName = matcher.group(1);
     Object obj = jsonObject.opt(groupName);
     if (obj != null && isJsonArray(obj.toString()))
      matcher.region(matcher.end() + obj.toString().replace("\\", "").length(), matcher.regionEnd());
     if (obj != null && !map.containsKey(groupName))
      map.put(groupName, regexJson(obj.toString()));
    }
    return map;
   } else if (isJsonArray(jsonStr)) {
    List<Object> list = new ArrayList<Object>();
    JSONArray jsonArray = new JSONArray(jsonStr);
    for (int i = 0; i < jsonArray.length(); i++) {
     Object object = jsonArray.opt(i);
     list.add(regexJson(object.toString()));
    }
    return list;
   }
  } catch (Exception e) {
   // TODO: handle exception
   Log.e("RegexUtil--regexJson", e.getMessage()+"");
  }
  return jsonStr;
 }

/**
  * To determine whether a string is JsonObject {@link org.json.JSONObject}
  * @param jsonStr {@link java.lang.String}
  * @return boolean
  */
 private static boolean isJsonObject(final String jsonStr) {
  if (jsonStr == null) return false;
  try {
   new JSONObject(jsonStr);
   return true;
  } catch (JSONException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   return false;
  }
 }

/**
  * To determine whether a string is JsonArray {@link org.json.JSONArray};
  * @param jsonStr {@link java.lang.String}
  * @return boolean
  */
 private static boolean isJsonArray(final String jsonStr) {
  if (jsonStr == null) return false;
  try {
   new JSONArray(jsonStr);
   return true;
  } catch (JSONException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   return false;
  }
 }
}

//使用方法
Object object = RegexUtil.regex(RegexPolicy.Json, jsonStr.substring(jsonStr.indexOf("{"),
         jsonStr.lastIndexOf("}")+1));
       if (object instanceof String) {
        Log.e("string", object.toString());
       } else if (object instanceof Map) {
        @SuppressWarnings("unchecked")
        HashMap<String, Object> map = (HashMap<String, Object>)object;
        Iterator<Entry<String, Object>>  iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
         Entry<String, Object> entry = iterator.next();
         if (entry.getValue() instanceof List) {
          Log.e(entry.getKey(), entry.getValue().toString());
         } else {
          Log.e(entry.getKey(), entry.getValue().toString());
         }
        }
       } else if (object instanceof List) {
        Log.e("list", object.toString());
       }

(0)

相关推荐

  • Java中JSON字符串与java对象的互换实例详解

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好,下面先看下JSON的格式, JSON可以有两种格式,一种是对象格式的,另一种是数组对象, {"name":"JSON","address":"北京市西城区","age":25}//JSON的对象格式的字符串 [

  • 浅析Java中JSONObject和JSONArray使用

    废话不多说,先给大家贴代码,具体代码如下所示: import net.sf.json.JSONArray; import net.sf.json.JSONObject; import java.util.*; public class JavaTest { public static void main(String[] args){ JSONObject obj=new JSONObject(); obj.put("derek","23"); obj.put(&q

  • JAVA对象JSON数据互相转换的四种常见情况

    1. 把java 对象列表转换为json对象数组,并转为字符串 复制代码 代码如下: JSONArray array = JSONArray.fromObject(userlist);     String jsonstr = array.toString(); 2.把java对象转换成json对象,并转化为字符串 复制代码 代码如下: JSONObject object = JSONObject.fromObject(invite);    String str=object.toString

  • Java代码实现Map和Object互转及Map和Json互转

    先给大家介绍下map和object互相转换的代码. 具体代码如所示: /** * 使用org.apache.commons.beanutils进行转换 */ class A { public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception { if (map == null) return null; Object obj = beanClass.newI

  • java生成json数据示例

    JsonTools.java 复制代码 代码如下: package com.lihua.json.tools; import net.sf.json.JSONObject; public class JsonTools { public JsonTools() { } /**   * @param key   *            表示json字符串的头信息   * @param value   *            是对解析的集合的类型   * @return   */  //将数据转

  • Java实现操作JSON的便捷工具类完整实例【重写Google的Gson】

    本文实例讲述了Java实现操作JSON的便捷工具类.分享给大家供大家参考,具体如下: 对于JSON数据格式的处理,自开发Java以来,已用过多种JSON的开源工具,用得最好,也用得最High的恐怕要属Google的Gson了. 特别为它写了一个工具类,放入常备工具中,方便使用.下面是为GSON 1.5版本重写的工具类. 依赖包: slf4j-api-1.6.0.jar slf4j-log4j12-1.6.0.jar log4j-1.2.15.jar gson-1.5.jar /** * Copy

  • java使用JSONObject实例

    一.引入jar包使用JSONObject必须引用JSON-lib.jar,同时它还依赖于其他包common-lang.jarcommon-beanuitls.jarcommon-collections.jarcommon-logging.jarezmorph.jar二.JSONObject对象使用JSON-lib包是一个java对象.xml.JSON互相转换的包.1.将Java对象转换成 json字符串 复制代码 代码如下: Person p1=new Person();p1.setName("

  • java中实体类和JSON对象之间相互转化

    在需要用到JSON对象封装数据的时候,往往会写很多代码,也有很多复制粘贴,为了用POJO的思想我们可以装JSON转化为实体对象进行操作 package myUtil; import java.io.IOException; import myProject.Student; import myProject.StudentList; import org.codehaus.jackson.map.ObjectMapper; import org.json.JSONArray; import or

  • Java中快速把map转成json格式的方法

    在日常的使用中,我们一般会遇到map转json,如果遍历的话会浪费大量的时间,其实我们拥有这样的jar包 复制代码 代码如下: The method *** is undefined for the type JSONObject 缺哪个包------ json-lib.jar 这样还是不行的 需要一个依赖的jar包要不然会报错 复制代码 代码如下: java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher 当当当当   jar包是ezmo

  • 使用Jackson来实现Java对象与JSON的相互转换的教程

    一.入门 Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换. 1.JAVA对象转JSON[JSON序列化] import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonDemo { p

  • GSON实现Java对象与JSON格式对象相互转换的完全教程

    Gson是一个Java库,用来实现Json和Java对象之间的相互转换.Gson是一个托管在https://github.com/google/gson的开源项目. Gson中主要的类是Gson,也可以使用类GsonBuilder在创建Gson对象的同时设置一些选项. Gson对象在处理Json时不会保存任何状态,所以使用者能够很轻松的对同一个Gson对象进行多次序列化.反序列化等操作. 示例:基本使用 //Serialization Gson gson = new Gson(); gson.t

随机推荐