json解析

380万条的json格式的数据进行解析

数据格式如下:

{
  "_id" : "b454e650cb1a4fa4a2f2bd6899fbfa73",
  "bb" : "116.2451019,39.8486099,116.2451019,39.8486099",
  "pts" : [{
      "1" : 0,
      "2" : 39.8486099,
      "3" : 116.2451019,
      "4" : 0.0,
      "5" : 0.0,
      "6" : "2012-03-07 14:25:08",
      "7" : "2012-03-07 14:25:10",
      "8" : "2",
      "9" : 0.0,
      "10" : 1
    }, {
      "1" : 1,
      "2" : 39.8486099,
      "3" : 116.2451019,
      "4" : 0.0,
      "5" : 0.0,
      "6" : "2012-03-07 14:25:16",
      "7" : "2012-03-07 14:25:17",
      "8" : "1",
      "9" : 0.0,
      "10" : 1
    }, {
      "1" : 2,
      "2" : 39.8486099,
      "3" : 116.2451019,
      "4" : -1.0,
      "5" : 0.0,
      "6" : "2012-03-07 14:25:18",
      "7" : "2012-03-07 14:25:20",
      "8" : "1",
      "9" : 0.0,
      "10" : 1
    }]
}


获取“_id”值和“bb”属性值(两点的经纬度坐标),获取“pts”属性中第一个标签6的值(起始时间)和最后一个标签7的属性值(终止时间),并根据经纬度计算两点之间的距离,根据起始时间和终止时间计算其时间差,得到每个“_id”的对应的距离和时间差

private final double PI = 3.1415926; //圆周率
	private final static double earthRadius = 6371; //地球半径,单位为KM
	
	public static void parseJson(BufferedReader bufferedReader) 
			throws IOException, ParseException, java.text.ParseException{
		
		String line = ""; //一行一行的形式读取文件
		String[] pts6FirstTime =null;//第一个坐标点标签6的时间
		String pts6Time ="";
		String ptsTime7 = "";
		String reslut = ""; //计算最终结果
		double betweenTime = 0.0d;//轨迹点之间的时间差,以小时(h)为单位
		
		//longitude1、longitude2、dimension1、dimension2分别为经度坐标和维度坐标
		double longitude1 = 0.0d;
		double dimension1 = 0.0d;
		
		double longitude2 = 0.0d;
		double dimension2 = 0.0d; 
		
		//设置时间格式
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		//创建json解析对象
		JSONParser jsonParser = new JSONParser();
		
		//创建一个distanceAndTime对象
		DistanceAndTime distanceAndTime = new DistanceAndTime();
		
		while((line = bufferedReader.readLine())!=null){
			//开始解析
			JSONObject jsonObject = (JSONObject)jsonParser.parse(line);
			
			String _id = (String) jsonObject.get("_id");//得到轨迹的id号
			
			String bb = (String) jsonObject.get("bb");//得到轨迹的经纬度坐标bb
			//经纬度坐标是以","进行分割的
			String[] longitudeDismension = bb.split(",");
			//Double.valueOf()把string类型转换为double类型
			longitude1 = Double.valueOf(longitudeDismension[0]);
			dimension1 = Double.valueOf(longitudeDismension[1]);
			
			longitude2 = Double.valueOf(longitudeDismension[2]);
			dimension2 = Double.valueOf(longitudeDismension[3]);
			
			//计算具有经纬度的两坐标间的距离
			double bbDistance = distanceAndTime.
					getDistance(longitude1, dimension1, longitude2, dimension2);
			
			//解析pts中的内容
			JSONArray ptsjsonArray = (JSONArray)jsonObject.get("pts");
			Iterator iterator = ptsjsonArray.iterator();
			
			//解析pts中标签6的内容,并得到第一个标签6的内容
			while(iterator.hasNext()){
				JSONObject pts6JSONObject = (JSONObject)iterator.next();
				pts6Time = pts6JSONObject.get("6").toString();
				pts6FirstTime = pts6Time.split("\r\n");
				break;//对于标签6的时间,只要第一个时间
			}
			
			//解析pts中标签7的内容,并得到最后一个标签7的内容
			while(iterator.hasNext()){
				JSONObject pts7jsonobject = (JSONObject)iterator.next();
				ptsTime7 = pts7jsonobject.get("7").toString();
			}
			
			//计算轨迹的时间差,单位为小时(H)
			Date date1 = dateFormat.parse(ptsTime7);
			Date date2 = dateFormat.parse(pts6FirstTime[0]);
			betweenTime = (date1.getTime()-date2.getTime())/1000.0/3600.0;
			
			reslut = _id+"\t"+bbDistance+"\t"+betweenTime;
			writeToLocal(reslut);
//			System.out.println(reslut);
		}
		
	}
	
	//已知经纬度的轨迹点,计算两个轨迹点之间的距离,单位为KM
	public double getDistance(double longitude1,double dimension1,double longitude2,double dimension2){
		double x,y,distance;
		x = (longitude1 - longitude2)*PI*earthRadius*
				Math.cos(((dimension1+dimension2)/2)*PI/180)/180;
		y = (dimension1-dimension2)*PI*earthRadius/180;
		distance = Math.hypot(x, y);
		return distance;
	}
	
	//计算结果输出
	public static void writeToLocal(String string) throws IOException{
		File outFile = new File("D://0820--Study//轨迹点数据//result.json");
		if (!outFile.exists()) {
			outFile.createNewFile();
		}
		
		//FileOutputStream设置为true,是为了后一条结果记录覆盖前一条结果记录
		FileOutputStream fileOutputStream = new FileOutputStream(outFile,true);
		OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
		BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
		bufferedWriter.write(string);
		bufferedWriter.newLine();
		bufferedWriter.flush();
		
		bufferedWriter.close();
		outputStreamWriter.close();
		fileOutputStream.close();
	}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZH519080/article/details/51555707
文章标签: java json
个人分类: java json
上一篇remote host identification has changed
下一篇读取任意行数据
想对作者说点什么? 我来说一句

json串的解析

2018年04月21日 2.49MB 下载

json解析js Tools

2008年08月26日 20KB 下载

windows下得json解析工具

2018年06月12日 105KB 下载

JsonView.rar

2010年03月16日 42KB 下载

JsonParseDemo

2015年12月07日 1.84MB 下载

c语言json数据格式解析

2011年07月13日 513KB 下载

最全的 json解析JAR包

2017年11月07日 1.19MB 下载

JSON解析 创建JSON

2016年07月22日 6.25MB 下载

android之JSON解析

2016年07月10日 2.02MB 下载

没有更多推荐了,返回首页

关闭
关闭