数据的格式与描述

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 数据的格式与描述

数据的格式

TXT:(非结构化数据 类似toString()格式):Student{name="张三",age=22,gender="女"}

CSV:张三,22,女(需要额外提供分隔符)

JSON:{name:"张三",age:22,gender:"女"}(只需要使数据符合JSON的结构)

引入架包的方式

定义

将架包缓存一份到内存中,所有web资源在External Libraries中查看。

Project structure - Libraries - 添加所需架包的.jar文件

解析

依赖

dom4j-1.6.1.jar

jaxen-1.1.6.jar

配置文件解析
Properties(小型配置)

config包下创建一个datasource.properties文件,properties类型数据以键值对存在。

name=henry
age=18
gender=female

class Properties extends HashTable<Object,Object>{}("HashTable就是线程安全的HashMap。")

Properties prop = new Properties();
prop.load(new FileReader("config/datasource.properties"));// prop装载流
final String name = prop.getProperty("name");
final String age = prop.getProperty("age");
final String gender = prop.getProperty("gender");

由于读取和写入数据需要通过流来实现,通过创建一个字符输入流,读取指定路径下的文件内容,通过load()方法来加载流中的数据,并将其解析成键值对的形式,存储在Properties对象中,最后在通过getProperty(String keyword)的方式获取值。

Xml解析(大型配置)

定义:XML是一种描述数据的标记语言,使用标签来定义数据的结构和内容。

  1. 字节类型
  • 对标签

​ 必须且只能有一个根节点,根节点的形式必须是对标签。

​ 在<>中输入/就会自动补全

<students>
</students>
  • 自闭合标签
<student/>
  1. 标签内容
  • 属性

    标签名字空格之后,以attr ="value"形式存在

<students>
  <student id="yb12211_01" in_date="2022-10-01"/>
</students>
  • 内容

    在对标签之间可以存放内容

<students>
  <student id="yb12211_01" in_date="2022-10-01">
          <name>henry</name>
          <age>18</age>
  </student>
</students>

即可以在对标签之内循环嵌套对标签,一般不超过3层

  1. 两种标签都可以有属性(多个属性之间用空格分隔 attr = "value"的形式存在),只有对标签可以有内容(文本|子标签)

  2. 解析路径

  • 绝对路径

    /开始,直至结束("/students(根节点名称)/student[@'属性或内容']")

  • 相对路径

​ 以//开始,直接面向需要找的节点("//student(所需节点名称)")

  • 限定属性

    xpath[@attr='v1'] [@attr='v2'] [subLabel[@attr3]] (如果没有值即说明有属性就行)

  • 限定文本

    xpath[text()='v1'] [subLabel[text()='v2']]

一个中括号内只能有一种限定,限定可以有并列和嵌套关系。

  1. 解析元素(解析节点时会将换行符视为空标签,于是通过解析元素的方式来解决这个问题,通过select解析之后返回值是node,而需要通过强转获取元素。)
SAXReader sr = new SAXReader();
final Document xmlDoc = sr.read(new FileReader(String xmlFilePath));//传入xml文件的相对路径
final Node node = xmlDoc.selectSingleNode(String xpath);
final List<Element> list = xmlDoc.selectNodes(String xpath);

Element ele = ...
String attrVal = ele.attributeValue(String keyName);// 提取自身属性值
String txt = ele.getText();// 提取自身内容(文本值)
提取子元素对象: 
        所有子元素 :List<Element> subElement = ele.Elements();
        获取指定的子元素:Element subEle = ele.element(String subElementName);
        String subEleAttr = subEle.attrbuteValue(String attrName);
        String subEleText = subEle.getText();        
提取子元素的内容(文本值):String txt = ele.elementText(String subElementName);
  1. 当数据格式不适合xml,json等已有类型,可能需要构造新的类型以及解析器

读取xml文件

Document(文档)是指XML文档的实例,通过Document对象我们可以操作XML文档的内容,是在内存中表示和操作XML数据的数据结构。Document是所有数据读取的起点。

与反射类比,通过document获取有固定格式的xml数据,相当于通过字节码文件获取有固定格式的类数据。

public static void main(String[] args) throws FileNotFoundException, DocumentException {
   
  SAXReader sr = new SAXReader();
  final Document xmlDoc = sr.read(new FileReader("config/datasource.xml"));// 包含了xml文件的所有信息,xml文件和Document文件存在着文件的内存与磁盘间的映射关系
  /**
         * 找到id=yb12211_01的学生并输出其in_date属性值
         */
  final Node node = xmlDoc.selectSingleNode("/students/student[@id='yb12211_02'][age[text()='22']]");// 表达式是由json准备的,如果表达式可能筛选出多个节点,xmlDoc.selectNode(),如果只能筛选出单个节点,sml.selectSingleNode()。返回值是node,一个节点代表了一个标签。
  if(null != node){
   
    Element ele = (Element) node;
    final String inDate = ele.attributeValue("in_date");
    final Element name = ele.element("name");// 获取子标签对象name
    final String firstName = name.elementText("firstName");
    final String lastName = name.elementText("lastName");
    //            final String name = ele.elementText("name");// ele.elementText()获取一级子元素,获取子标签name的文本内容
    final String age = ele.elementText("age");
    final String salary = ele.elementText("salary");
    System.out.println("in_date属性值:"+inDate);
    //            System.out.println(name);
    System.out.println(String.format("%s%s",firstName,lastName));
    System.out.println(age);
    System.out.println(salary);
  }else{
   
    System.out.println("no node found");
  }
}

Json解析(可跨平台数据交互)

  • 定义

    "{}"->在json对象的基础上,添加双引号,并在其中去掉所有值的双引号,得到json字符串

    用json字符串去看json对象

    前端json对象传到后端,先变成一个json字符串,然后再反向解析成json对象

    {}:表示对象,可以嵌套(对象的属性是对象)

jsonString:"{
   "name":"herry","age":18,"hobby":["beauty","money","power"],"address":{
   "province":"jiangsu","city":"nanjing","county":"pukou","detail":"..."}}"//{对象  []数组

jsonObject:{name:"herry",age:18,hobby:["beauty","money","power"],address:{province:"jiangsu",city:"nanjing",county:"pukou",detail:"..."}
  • jackson

    jackson框架是结合spring框架,基于java平台的一套数据处理工具

    jackson框架包含了三个核心库:streaming,datamind,annotations

  • fastjson

    fastjson.jar常用于个人开发

    可以方便的实现Json对象与JavaBean对象的转化

    实现JavaBean对象与Json字符串的转化

    实现Json对象与Json字符串的转换

    final String jsonStr = JSON.toJSONString(T t);
    final T t = JSON.parseObject(jsonStr,Class<T> class);
    
目录
相关文章
|
3天前
|
Java
格式
局部变量和成员变量 1.定义的位置不一样【重点】 局部变量:在方法的内部 成员变量:在方法的外部,直接写在类当中 2.作用范围不一样【重点】 局部变量:只有方法当中才可以使用,出了方法就不能再用 成员变量:整个类全都可以通用。 3.默认值不一样【重点】 局部变量:没有默认值,如果要想使用,必须手动进行赋值 成员变量:如果没有赋值,会有默认值,规则和数组一样 4.内存的位置不一样(了解) 局部变量:位于栈内存 成员变量:位于堆内存 5生命周期不一样(了解) 局部变量:随着方法进栈而诞生,随着方法出栈而消失 成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失 当方法的局部变量和类的成员变量重名
15 0
|
3天前
|
BI 数据处理 数据库
常用的盘点表格式及其在VeryReport报表软件中的实现
常用的盘点表格式及其在VeryReport报表软件中的实现
|
9月前
|
XML 存储 JSON
文本数据交换格式 -- JSON
文本数据交换格式 -- JSON
55 0
Excel中的数字格式与文本格式进行转换
Excel中的数字格式与文本格式进行转换
116 0
Excel中的数字格式与文本格式进行转换
|
数据处理
程序返回数据的标准格式
程序返回数据的标准格式
67 0
1473. A + B 格式
1473. A + B 格式
70 0
|
Unix
weppy格式的转换
weppy格式的转换
123 0
|
存储 Python
文件和数据格式化
文件和数据格式化
131 0
文件和数据格式化
|
区块链
技术|形式多样的 substrate 格式
技术|形式多样的 substrate 格式
270 0
技术|形式多样的 substrate 格式
Biopython:Fasta格式转CSV格式
Biopython:Fasta格式转CSV格式
325 0
Biopython:Fasta格式转CSV格式

热门文章

最新文章