开发者学堂课程【大数据 Spark2020版(知识精讲与实战演练)第四阶段:行政区信息_JSON 解析实现】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/691/detail/12121
行政区信息_JSON 解析实现
JSON 解析实现
进行具体功能实现,第一步进行 JSON 解析,
1.目标和步骤
(1)目标
通过 JSON4S 和 ESRI 配合解析提供的 GeoJSON 数据集,获取纽约的每个行政区的范围
(2)步骤
①解析 JSON
②使用 ESRI 生成表示行政区的一组 Geometry 对象
2.解析 JSON
(1)步骤
对照 JSON 中的格式,创建解析的目标类(解析 JSON 需要将数据放入对象中,对象的类型需要和 JSON 数据结果是匹配的,先创建目标类,按照 JSON 格式进行创建)
解析 JSON 数据转为目标类的对象
读取数据集,执行解析
step 1:创建目标类
GeoJSON
{
"type"" : "Featurecollection"
,
"features" : [
①
"type" : "Feature" ,
"id" : 0,
"properties" : {
"boroughcode" : 5,
"borough" : "Staten Island" ,
"@id":"http:\/\/nyc.pediacities.com\/Resource\/Borough
\
/staten_Island"
},
"geometry" : {
"type" : "Polygon" ,
"coordinates" : [
[
[-74.050508064032471,40.566422034160816],[-74.049983525625748,40.566395924928273]]
]
]
}
}
]
}
审核 GeoJSON,最外层是一个对象,花括号开始花括号结束,type 是一个属性, features 是一个属性,features 后有一个中括号,与后面中括号对应,又是一个对象,是数组类型,数组中有多个 feature,两个花括号对应,feature 有个属性properties,关注 borough 行政区名称,geometry 代表行政区范围
①features 是一个数组,其中每一个 Feature 代表一个行政区
目标类
将 JSON 解析出来,最外层是 Featurecollection,在 JSON 中可以没有某个具体结构,不解析,如果有要与前面名字一一对应
case class Featurecollection(
features : List[Feature]
)
case class Feature(
id: Int,
properties: Map[String, string]
,
geometry: J
O
bject
)
case class FeatureProperties(boroughcode: Int,borough: string)
features 中是一个 JSON 数组,对象是 feature 对象,feature 有一个 properties,properties 是一个 map,通过 properties 取出其 name,取出 borough 行政区的名字,将 JSON 对象转成 map,通过 map 取 borough 字段,用 JObject 表示 geometry 对象,FeatureProperties 代表 properties 中一个具体对象,可以使用 map 转为 FeatureProperties
将 JSON 拷入 idea 中,创建一个新的类,命名为 Features
{
"type"" : "Featurecollection"
,
"features" : [
①
{
"type" : "Feature" ,
"id" : 0,
"properties" : {
"boroughcode" : 5,
"borough" : "Staten Island" ,
"@id":"http:\/\/nyc.pediacities.com\/Resource\/Borough
\
/staten_Island"
},
"geometry" : {
"type" : "Polygon" ,
"coordinates" : [
[
[-74.050508064032471,40.566422034160816],[-74.049983525625748,40.566395924928273]]
]
]
}
}
]
}
第一个类型命名为 Featurecollection,Featurecollection 关注 features,创建具体执行对象,将 Feature 放入 list 中,有 type、id,properties,拿到 properties,可以使用 scala 继续表示类型,也可以使用 map,map 中有键值对,值对应其中的值,获取 geometry 对象,后续要使用 ESRI 直接解析字符串,接下来不需要解析字符串,转为 JObject
import org.json4s. 3sonAST.JObject
case class Featurecollection(features: List[Feature])
case class Feature(properties: Map[String,string], geometry: J0bject)
表示完类型后,将 JSON 字符串解析为目标类对象
提供 object,命名为 FeatureExtraction,提供 parseJson 方法,接收 Json 字符串,返回类型是 FeatureCollection,在方法中完成具体解析工作,导入一个formats隐式转换,JSON 转为 Object
Implicit 创建一个隐式参数,具体转换通过 read 转为 FeatureCollection 类型,将json 传入,read 方法导入一个包,read 方法返回一个对象,FeatureCollection,将 FeatureCollection 对象直接返回,在外部使用时,直接将 json 传入,给 FeatureCollection 类型,在类的范围内完成解析
features 也是一个工具类
object FeatureExtraction {
//完成具体的 JSON 解析工作
def parseson(json: string) : FeatureCollection = {
import org.json4s.jackson.Serialization.readl
//1.导入一个 formats 隐式转换
implicit val formats = Serialization.formats(NoTypeHints)
//2. JSON -> obj
val featurecollection = read[Featurecollection](json)
featurecollection
}
}