`

【转】JSon数据的解析

阅读更多

 

最近一个项目要对艺龙,携程等酒店预订网站进行价格信息采集.因为这两个网站都不是省油的灯啊,多次提交ajax表单,参数编码,获取特定的城市和酒店代码等等手段,可谓过五关斩六将,总算是把数据采集回来,但是又面临一个难题:采集回来的信息是json格式的,那就涉及到json数据转换成java对象了

 

 

 

首先要了解json数据的格式

 

[{"CityType":"hotel","TabList":[{"TabId":"1","Name":"\u70ED\u95E8","NameEn":"Hot",
"CityList":[{"ProvinceId":null,"CityId":"0101","CityCode":"0101",
"CityNameCn":"\u5317\u4EAC","CityNameEn":"Beijing",
"CityThreeSign":"","CityType":"hotel","OldEnglishName":"peking"},
{"ProvinceId":null,"CityId":"0201","CityCode":"0201",
"CityNameCn":"\u4E0A\u6D77","CityNameEn":"Shanghai",
"CityThreeSign":"","CityType":"hotel","OldEnglishName":""},
{"ProvinceId":null,"CityId":"2001","CityCode":"2001",
"CityNameCn":"\u5E7F\u5DDE","CityNameEn":"Guangzhou",
"CityThreeSign":"","CityType":"hotel","OldEnglishName":"canton"}]}]}];

 

jsonViewer是个好东西,不过HTTPAnalysis直接就集成了jsonViewer,不过还是前者比较轻巧:

json和java之间的互换可以使用json-lib, 基本的使用可以看文档就行.网上也有一些集成的类,我建议直接看它的源代码,了解他是如何通过反射和使用临时对象解析json数据,并封装成java对象.

这个json数据时list的嵌套,如果要对整个json文件解析,需要使用如下方法,需要构造跟json数据对应的Tab.class 和City.class,而且字段名称必须一致(骆驼首字母小写),提供默认构造方法,这样就可以将json数据作为一个完整的对象,想怎么干都行了.

 

HashMap<String,Class> map = new HashMap<String,Class>();
map.put("tabList", Tab.class);
map.put("cityList", City.class);

	    /**
	     * 从一个JSON数组得到一个java对象集合,其中对象中包含有集合属性
	     * @param object
	     * @param clazz
	     * @param map 集合属性的类型 (key : 集合属性名, value : 集合属性类型class) 
eg: ("beansList" : Bean.class)
	     * @return
	     */
	    public static List getDTOList(String jsonString, Class clazz, Map map){
	        setDataFormat2JAVA();
	        JSONArray array = JSONArray.fromObject(jsonString);
	        List list = new ArrayList();
	        for(Iterator iter = array.iterator(); iter.hasNext();){
	            JSONObject jsonObject = (JSONObject)iter.next();
	            list.add(JSONObject.toBean(jsonObject, clazz, map));
	        }
	        return list;
	    }     

由于我的需求只是需要重json数据中获取特定的信息对象,如上面的cityList,像tabList等对象我没必要去构造和获取,而且在实际使用过程中我发现

JSON数据中变量如果不是首字母小写,是无法转换成JAVA对象的.这个确实很坑爹!!!!!

 

于是乎,我就写了个直接读取和解析一个片段json数据的类,有了这个类,加上对象映射,基本上没什么解析不了

 

package com.engine.logic.component.loader.impl.json.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class JSonStrUtils {

	/**
	 * json 数据括号自动补全
	 * **/
	public static String autoComplete(String targetJson){
		LinkedList<Character> stack = new LinkedList<Character>();
		String returnStr ="";
		char[] charArray = targetJson.toCharArray();
		for(int i = 0;i<charArray.length;i++){
			if(charArray[i]=='['||charArray[i]=='{'){//入栈
				stack.addFirst(charArray[i]);
			}else if(charArray[i]==']'){
				//判断是否闭合
				char last = stack.peekFirst();
				if(last !='['){//不闭合,补 }
					returnStr+='}';
				}else//闭合
				{
					stack.pollFirst();
				}
			}else if(charArray[i]=='}'){
				//判断是否闭合
				char last = stack.peekFirst();
				if(last !='{'){//不闭合,补 }
					returnStr+=']';
				}else//闭合
				{
					stack.pollFirst();
				}
			}
			returnStr+=charArray[i];
		}
		for(char c:stack){
			System.out.println("left in stack:"+c);
		}
		return returnStr;
	}

	/***
	 * 用于处理json数据中出现变量名非首字母小写的情况,利用正则匹配变量,然后把首字母变成小写
	 * */
	public static String dealWithFirstChar(String jsonInput){
		String originalInput = jsonInput;
		StringBuilder inputStr = new StringBuilder(jsonInput);
		String regex = "\"(\\w+)\":";
		Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
		Matcher m = p.matcher(inputStr);
		List<String> result=new ArrayList<String>();
		while(m.find()){
			String valueName = m.group(1);
			String newValueName = null;
			char[] words =valueName.toCharArray();
			if(Character.isUpperCase(words[0])){//首字母大写,不符合变量命名规范

				words[0] = Character.toLowerCase(words[0]);
				newValueName = new String(words);
//				System.out.println("orignal value:"+valueName+" new value :"
+ newValueName);
//				String regexWord = "\""+valueName+"\":";
				String regx1 = "\""+valueName+"\":";
				String replace = "\""+newValueName+"\":";
				originalInput=originalInput.replaceAll(regx1, replace);
			}
			result.add(valueName);
			inputStr.delete(0, m.end(0));
			m=p.matcher(inputStr);
		}
		return originalInput;

	}

	/***
	 * 用户将unicode编码转换成汉字
	 * */
	public static String UnicodeToString(String str) {
        Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
        Matcher matcher = pattern.matcher(str);
        char ch;
        while (matcher.find()) {
            ch = (char) Integer.parseInt(matcher.group(2), 16);
            str = str.replace(matcher.group(1), ch + "");
        }
        return str;
    }

	/***
	 * 用户将汉字转换成unicode编码
	 * */
	public static String toUNICODE(String s)
    {
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++)
        {
            if(s.charAt(i)<=256)
            {
                sb.append("\\u00");
            }
            else
            {
                sb.append("\\u");
            }
            sb.append(Integer.toHexString(s.charAt(i)).toUpperCase());
        }
        return sb.toString();
    }

	/**
	 * 读取json文件,转换为字符串
	 * */
	public static String readJSonFile(String fileName){
		InputStream in = null;
		String jsonStr = "";
		try {
			in = JSonStrUtils.class.getResourceAsStream(fileName);
		BufferedReader reader = new BufferedReader(new InputStreamReader(in));
			String temp = reader.readLine();
			while(temp!=null){
				jsonStr+=temp;
				temp = reader.readLine();
			}
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("read json file failed :"+fileName);
		}
		return jsonStr;
	}

	/***
	 * 在指定的JSONObject 中寻找特定属性的第一个值
	 * */
	public static List<String> findTargetProperty(JSONObject object,
String propertyName,boolean isRecursive){
		List<String> values = new ArrayList<String>();
		for( Iterator entries = object.names().iterator();
		 entries.hasNext(); ){
			String name = (String) entries.next();
			Object value = object.get(name);
			if(name.equals(propertyName)){//找到目标属性
				values.add(value.toString());
			}else if(isRecursive){
				if(value instanceof JSONObject){
					values.addAll(findTargetProperty((JSONObject)value,
propertyName,isRecursive));
				}else if(value instanceof JSONArray){
					JSONArray array = (JSONArray)value;
					for(Iterator iter = array.iterator(); iter.hasNext();){
						JSONObject jsonObject = (JSONObject)iter.next();
						values.addAll(findTargetProperty(jsonObject,
propertyName,isRecursive));
					}
				}
			}
		}
		return values;
	}

	/***
	 * 从指定的JSonArray中寻找指定名称的子json数组
	 * */
    public  static List<JSONArray> findTargetJSonArray(JSONArray array,
String targetName){
    	List<JSONArray> arrays = new ArrayList<JSONArray>();
    	for(Iterator iter = array.iterator(); iter.hasNext();){//遍历数组中的JSONObject
			JSONObject jsonObject = (JSONObject)iter.next();
			if( jsonObject == null || jsonObject.isNullObject() ){
		         continue;
		    }
			for( Iterator entries = jsonObject.names().iterator();
			 entries.hasNext(); ){
				 String name = (String) entries.next();
				 Object value = jsonObject.get(name);
				 if(value instanceof JSONArray){//属性为数组
					 //先判断是否目标数组
					 if(name.equals(targetName)){
						 arrays.add((JSONArray) value);
					 }
					 //递归查找
					 arrays.addAll(findTargetJSonArray((JSONArray) value,
targetName));
				 }
			}
    	}
    	return arrays;

    }
}

 

 

转自:http://xoknight.net/?p=184

分享到:
评论

相关推荐

    Android_JSON数据解析

    本篇将详细讲解如何在Android应用中解析JSON数据,主要涉及以下几个方面: 1. JSON基本结构 JSON由两种基本结构构成:对象(Object)和数组(Array)。对象是以花括号 `{}` 包围的键值对集合,键用双引号括起,如`...

    json离线解析工具

    在处理JSON数据时,一个有效的工具是至关重要的,尤其是对于开发者来说,能够快速查看、格式化和编辑JSON数据的离线解析工具更是必不可少。 标题中的“json离线解析工具”指的是无需互联网连接即可使用的JSON解析...

    json 数据解析包

    标题提到的“json 数据解析包”是一组Java库,它们可以帮助开发者在Java环境中解析和操作JSON数据。以下是这些库的详细介绍: 1. **commons-collections-3.2.jar**:Apache Commons Collections是Apache软件基金会...

    Android 实用的数据json数据解析封装类

    本篇文章将详细介绍如何创建一个实用的JSON数据解析封装类,以便快速有效地处理各种形式的JSON数据。 首先,我们需要引入一个JSON库,Android SDK本身包含了org.json库,但为了更强大的功能和更好的性能,推荐使用...

    PB解析json,解析JSON案例,解析jsondemo

    标题中的“PB解析json,解析JSON案例,解析jsondemo”表明了本文主要关注的是PowerBuilder(简称PB)如何处理JSON数据。在现代软件开发中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,...

    json复杂数据解析demo

    在本示例"json复杂数据解析demo"中,我们将探讨如何处理结构复杂、层次丰富的JSON数据。 首先,我们需要理解JSON的基本结构。JSON数据由键值对组成,键用引号包围,后面跟着冒号,值可以是字符串、数字、布尔值、...

    Android中Json数据解析

    本教程将深入探讨在Android中如何解析和处理JSON数据。 首先,我们需要理解JSON的基本结构。JSON是一种基于键值对的数据表示方式,主要由对象(Object)和数组(Array)构成。对象用花括号 `{}` 包裹,键值对以冒号...

    json数据解析源码

    总的来说,这个“json数据解析源码”项目涵盖了从获取到解析JSON数据,再到对数据进行操作和输出的整个流程。在实际应用中,根据具体需求,可能还需要处理错误、验证数据格式、优化性能等方面的问题。理解并掌握这些...

    基于python+pyqt+paho.mqtt 的MQTT客户端实现及json数据解析

    基于python+pyqt+paho.mqtt 的MQTT客户端实现及json数据解析 基于python+pyqt+paho.mqtt 的MQTT客户端实现及json数据解析 基于python+pyqt+paho.mqtt 的MQTT客户端实现及json数据解析 基于python+pyqt+paho.mqtt 的...

    基于Newtonsoft.Json实现Json数据解析和封装

    Newtonsoft.Json已经足够强大,易用性也没得说。但是在使用过程中存在着一个问题,如果数据不存在...JsonObject类和JsonArray类可以相互嵌套,支持原生类的JsonPath检索能力,满足Json数据解析和Json数据封装常见需求。

    json数据解析json数据解析

    json数据解析

    android之json和gson数据解析最完整的代码例子(包括各种样式的json数据)

    本文将详细介绍如何在Android应用中使用JSON和Gson进行数据解析,并通过实际代码示例来演示各种类型的JSON数据处理。 一、JSON基础 1. JSON格式:JSON是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式...

    GRIB2 数据 转 JSON

    转换工具有助于简化数据解析和可视化的过程,使得数据更容易被JavaScript或Python等编程语言处理。 首先,我们需要了解GRIB2数据结构。GRIB2文件由一系列消息组成,每个消息包含一个或多个要素,如温度、湿度、风速...

    奇葩json 数据 解析

    这个话题“奇葩json数据解析”就聚焦于如何处理那些不符合标准的JSON数据。 在描述中提到,使用AFNetworking(简称AFN)进行POST请求时遇到了一个问题:返回的数据不是标准的JSON格式,导致解析失败。AFNetworking...

    易语言教学 - json模块解析/获取文本 示例源码

    在本教程中,我们将探讨的是如何使用易语言中的json模块进行数据解析和获取文本的实践操作。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于网络数据传输。 首先,我们有三个不同的JSON...

    Json数据解析包

    在标题"Json数据解析包"中,我们可以理解为这是一个专门用于解析和处理JSON格式数据的工具包。在实际的编程工作中,解析JSON数据是相当常见的需求,例如从服务器获取响应数据、读取配置文件或者存储轻量级的数据结构...

    Revit模型转JSON数据测试数据(JSON数据)

    此外,测试数据也可以用于开发和调试应用程序,确保它们能正确解析和使用这些JSON数据。 在实际应用中,将Revit模型转为JSON数据可以促进BIM数据的开放性,推动建筑行业的数字化转型。例如,建筑师、工程师和承包商...

    android中JSON数据解析

    在Android开发中,JSON...总的来说,Android中的JSON数据解析是通过理解JSON结构,结合`org.json`库或Gson库,以及适当的网络请求库来实现的。合理使用这些工具,能有效地处理和展示从服务器获取的JSON数据。

    HttpURLConnection获取json数据解析

    **二、JSON数据解析** JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中,可以使用`org.json`库来解析JSON数据。 1. **导入JSON库**:在...

    基于python+pyqt+paho.mqtt 的MQTT客户端实现及json数据解析(源码),开箱即用

    基于python+pyqt+paho.mqtt 的MQTT客户端实现及json数据解析(源码),开箱即用! 基于python+pyqt+paho.mqtt 的MQTT客户端实现及json数据解析(源码),开箱即用! 基于python+pyqt+paho.mqtt 的MQTT客户端实现及...

Global site tag (gtag.js) - Google Analytics