Java method for parsing json strings with arbitrary number of layers

  • 2020-04-01 02:57:24
  • OfStack


//The parsing strategy may be to parse json strings, images in the data address, email, etc
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;

public class RegexUtil {
 //A regular expression that matches the parsing strategy
 //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]*?) *?" *?: *?\[ *?\{";

        //Common method parsing, just pass in the string
 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;
 }

 
 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;
  }
 }

 
 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;
  }
 }
}
//Method of use
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());
       }


Related articles: