目录
16.1 Json是什么?
16.2 Json的语法规则
16.3 JSON 和 XML
16.4 java中关于json中的jar包
GSON:由谷歌进行开发
Fastjson: 由阿里进行开发
16.5 JsonObject讲解
1.介绍
2. 依赖
3. 方法
4. 实例-将json数据转换成java对象
16.6 json在MapReduce中的引用
JSON,全称是 JavaScript Object Notation,即 JavaScript对象标记法。
JSON无论对于人,还是对于机器来说,都是十分便于阅读和书写的,而且相比 XML(另一种常见的数据交换格式),文件更小,因此迅速成为网络上十分流行的交换格式。
JSON 的语法规则十分简单,可称得上“优雅完美”,总结起来有:
数组(Array)用方括号(“[]”)表示。
对象(0bject)用大括号(“{}”)表示。
名称/值对(name/value)组合成数组和对象。
名称(name)置于双引号中,值(value)有字符串、数值、布尔值、null、对象和数组。
并列的数据之间用逗号(“,”)分隔
JSON常被拿来与XML做比较,因为JSON 的诞生本来就多多少少要有取代XNL的意思。
相比 XML,JSON的优势如下:
没有结束标签,长度更短,读写更快
能够直接被JavaScript解释器解析
可以使用数组
两者比较
JSON:
{
"name":"兮动人",
"age":22,
"fruits":["apple","pear","grape"]
}
XML:
兮动人
22
apple
pear
grape
下载地址:https://blog.csdn.net/u011403174/article/details/89491448
下载地址:https://github.com/alibaba/fastjson
1)JSONObject只是一种数据结构,可以理解为JSON格式的数据结构(key-value 结构),可以使用put方法给json对象添加元素。JSONObject可以很方便的转换成字符串,也可以很方便的把其他对象转换成JSONObject对象。
2)JSON(JavaScript Object Notation的首字母缩写)是一种轻量级数据交换格式,最常用于客户端 - 服务器通信。它既易于读/写,又与语言无关。JSON值可以是另一个JSON 对象,数组,数字,字符串,布尔值(true / false)或null。也是后端开发中经常要接触的一个一个类,将要数据封装成json然后传递给前端。
com.alibaba
fastjson
1.2.46
toJSONString(Object)【将指定的对象序列化成Json表示形式】
parseObject(String, Class)【将json反序列化为指定的Class模式】
这里有一个movie.txt的json文件,数据
package hadoop;
import com.alibaba.fastjson.JSONObject;
import com.doit.day03.Student;
import java.io.*;
public class JsonDemo {
public static void main(String[] args) throws IOException {
BufferedReader file=new BufferedReader(new FileReader("C:\\Users\\35014\\Desktop\\大数据\\test_file\\movie.txt"));
String line=null;
while ((line=file.readLine())!=null){
//将json反序列化为Movie模式
Movie movie = JSONObject.parseObject(line, Movie.class);
System.out.println(movie);
//将Movie模式序列化为Json表示形式
String s = JSONObject.toJSONString(movie);
System.out.println(s);
}
file.close();
}
}
获取每部电影的平均分
package com.doit.day03;
import com.alibaba.fastjson.JSONObject;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
// 每部电影的平均评分
public class MovieDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
// 创建配置文件对象
Configuration conf = new Configuration();
// 创建任务对象
Job job = Job.getInstance(conf, "movie_rate");
// 设置job任务中的map任务的任务类
job.setMapperClass(MovieMapper.class);
// 设置job任务中的reduce任务的任务类
job.setReducerClass(MovieReducer.class);
// 设置map端的输出的结果数据的类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(DoubleWritable.class);
// 设置reduce端的输出的结果数据的类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(DoubleWritable.class);
// 设置任务读取的文件的地址
FileInputFormat.setInputPaths(job, new Path("D:\\hdp_data\\movie"));
// 设置任务输出的结果文件的地址
FileOutputFormat.setOutputPath(job, new Path("D:\\hdp_data\\movie_value"));
// 将任务做提交操作
job.waitForCompletion(true);
}
static class MovieMapper extends Mapper {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String str = value.toString();
Movie mv = JSONObject.parseObject(str, Movie.class);
String movie = mv.getMovie();
String rate = mv.getRate();
System.out.println("movie:"+movie+"rate:"+rate);
context.write(new Text(movie), new DoubleWritable(Double.parseDouble(rate)));
}
}
static class MovieReducer extends Reducer {
@Override
protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
int count = 0;
int sum = 0;
for (DoubleWritable value : values) {
sum += value.get();
count++;
}
double avg = sum / count;
context.write(key, new DoubleWritable(avg));
}
}
}