使用golang解析yaml、json、xml文件

简介: 使用golang解析yaml、json、xml文件

解析和生成yaml文件


YAML(YAML 不是标记语言)是一种人类可读的数据序列化语言。它通常用于配置文件,但也用于数据存储或传输。YAML 本身支持三种基本数据类型:标量(例如字符串、整数和浮点数)、列表和映射(字典/哈希)。我们使用 yaml.v3 包来解析yaml文件


go get gopkg.in/yaml.v3


解析yaml


func Unmarshal(in []byte, out interface{}) (err error)


我们使用 Unmarshal来解析yaml yaml文件内容如下:


- name: wanger
  age: 24
  address: beijing
  hobby:
    - literature
    - social
- name: 冬哥
  age: 30
  address: chengdu
  hobby:
    - basketball
    - guitar
- name: 华子
  age: 27
  address: shenzhen
  hobby:
    - 王者荣耀
- name: 乔克
  age: 29
  address: chongqing
  hobby:
    - 阅读
    - 王者荣耀
- name: 夏老师
  age: 27
  address: chengdu
  hobby:
    - 吃吃喝喝
- name: 姜总
  age: 25
  address: shanghai
  hobby:
    - talkshow
- name: 郑哥
  age: 30
  address: beijing
  hobby:
    - 阅读
    - 复读机


读取test.yaml


package main
import (
 "fmt"
 "gopkg.in/yaml.v2"
 "io/ioutil"
 "gopkg.in/yaml.v3"
 "log"
)
type Users struct {
 Name   string      `yaml:"name"`
 Age    int8        `yaml:"age"`
 Address  string `yaml:"address"`
 Hobby []string `yaml:"hobby"`
}
func main() {
 file, err := ioutil.ReadFile("test.yaml")
 if err != nil {
  log.Fatal(err)
 }
 var data [7]Users
 err2 := yaml.Unmarshal(file, &data)
 if err2 != nil {
  log.Fatal(err2)
 }
 for _, v := range data {
  fmt.Println(v)
 }
}


输出内容如下


{wanger 24 beijing [literature social]}
{冬哥 30 chengdu [basketball guitar]}
{华子 27 shenzhen [王者荣耀]}
{乔克 29 chongqing [阅读 王者荣耀]}
{夏老师 27 chengdu [吃吃喝喝]}
{姜总 25 shanghai [钓鱼  音乐 美食  酒talkshow]}
{郑哥 30 beijing [阅读 复读机]}


生成yaml


func Marshal(in interface{}) (out []byte, err error)


我们使用 Marshal来生成yaml,生成一个关于我们团队信息的yaml文件吧 可以通过定义结构体yaml标签来自定义输出的yaml文件的键名


package main
import (
 "fmt"
 "gopkg.in/yaml.v3"
)
type Users struct {
 Name   string      `yaml:"name"`
 Age    int8        `yaml:"age"`
 Address  string `yaml:"address"`
 Hobby []string `yaml:"hobby"`
}
func main() {
 wanger := Users{
  Name: "wanger",
  Age:  24,
  Address: "beijing",
  Hobby: []string{"literature", "social"},
 }
 dongdong := Users{
  Name: "冬哥",
  Age:  30,
  Address: "chengdu",
  Hobby: []string{"basketball", "guitar"},
 }
 xialaoshi := Users{
  Name: "夏老师",
  Age:  29,
  Address: "chengdu",
  Hobby: []string{"吃吃喝喝"},
 }
 huazai := Users{
  Name: "华子",
  Age:  28,
  Address: "shenzhen",
  Hobby: []string{"王者荣耀"},
 }
 qiaoke := Users{
  Name: "乔克",
  Age:  30,
  Address: "chongqing",
  Hobby: []string{"阅读", "王者荣耀"},
 }
 jiangzong := Users{
  Name: "姜总",
  Age:  25,
  Address: "shanghai",
  Hobby: []string{"钓鱼","音乐","美食","酒"},
 }
 zhengge := Users{
  Name: "郑哥",
  Age:  30,
  Address: "beijing",
  Hobby: []string{"阅读", "复读机"},
 }
    userlist:=[7]Users{wanger,dongdong,huazai,qiaoke,xialaoshi,jiangzong,zhengge}
 yamlData, err := yaml.Marshal(&userlist)
 if err != nil {
  fmt.Printf("Error while Marshaling. %v", err)
 }
 fmt.Println(string(yamlData))
    fileName := "test.yaml"
    err = ioutil.WriteFile(fileName, yamlData, 0644)
    if err != nil {
        panic("Unable to write data into the file")
    }
}


生成的yaml信息如下


- name: wanger
  age: 24
  address: beijing
  hobby:
    - literature
    - social
- name: 冬哥
  age: 30
  address: chengdu
  hobby:
    - basketball
    - guitar
- name: 华子
  age: 27
  address: shenzhen
  hobby:
    - 王者荣耀
- name: 乔克
  age: 29
  address: chongqing
  hobby:
    - 阅读
    - 王者荣耀
- name: 夏老师
  age: 27
  address: chengdu
  hobby:
    - 吃吃喝喝
- name: 姜总
  age: 25
  address: shanghai
  hobby:
    - 钓鱼  
    - 音乐
    - 美食 
    - 酒
- name: 郑哥
  age: 30
  address: beijing
  hobby:
    - 阅读
    - 复读机


解析和生成json文件


我们使用encoding/json标准库包来实现json文件的解析与生成


读取和解析json文件


func Unmarshal(data []byte, v interface{}) error


我这里定义了一个user.json文件


{
  "users": [
    {
      "name": "wanger",
      "address": "beijing",
      "age": 24,
      "social": {
        "mobile": "111111111",
        "email": "wanger@163.com"
      }
    },
    {
      "name": "dongdong",
      "address": "chengdu",
      "age": 30,
      "social": {
        "mobile": "2222222222222222",
        "emial": "dongdong@163.com"
      }
    },
    {
      "name": "夏老师",
      "address": "chengdu",
      "age": 29,
      "social": {
        "mobile": "2232222222222222",
        "emial": "xialaoshi@163.com"
      }
    },
    {
      "name": "郑哥",
      "address": "beijing",
      "age": 30,
      "social": {
        "mobile": "12222211111",
        "email": "zhengge@163.com"
      }
    },
    {
      "name": "姜总",
      "address": "shanghai",
      "age": 25,
      "social": {
        "mobile": "111122211",
        "email": "jaingzong@163.com"
      }
    },
    {
      "name": "乔克",
      "address": "chongqing",
      "age": 30,
      "social": {
        "mobile": "11333331111111",
        "email": "qiaoke@163.com"
      }
    },
    {
      "name": "华仔",
      "address": "shenzhen",
      "age": 28,
      "social": {
        "mobile": "113311111",
        "email": "huazai@163.com"
      }
    }
  ]
}


读取user.json文件


package main
import (
 "encoding/json"
 "fmt"
 "io/ioutil"
 "os"
 "strconv"
)
func main() {
 jsonFile,err:=os.Open("user.json")
 if err != nil {
  fmt.Println(err)
 }
 fmt.Println("Successfully Opened users.json")
 defer jsonFile.Close()
 byteValue,_:=ioutil.ReadAll(jsonFile)
 var users Users
 json.Unmarshal(byteValue,&users)
 for i :=0;i<len(users.Users);i++ {
  fmt.Println("User Type: "+ users.Users[i].Address)
  fmt.Println("User Age: "+strconv.Itoa(users.Users[i].Age))
  fmt.Println("User Name: "+users.Users[i].Name)
  fmt.Println("User Email: "+users.Users[i].Social.Email)
 }
 var result Users
 json.Unmarshal(byteValue,&result)
}
type Users struct {
 Users []User `json:"users"`
}
type User struct {
 Name string `json:"name"`
 Address string `json:"address"`
 Age int `json:"Age"`
 Social Social `json:"social"`
}
type Social struct {
 Mobile string `json:"mobile"`
 Email string `json:"email"`
}


输出结果如下


Successfully Opened users.json
User Type: beijing
User Age: 24
User Name: wanger
User Email: wanger@163.com
User Type: chengdu
User Age: 30
User Name: dongdong
User Email: 
User Type: chengdu
User Age: 28
User Name: 夏老师
User Email: 
User Type: beijing
User Age: 30
User Name: 郑哥
User Email: zhengge@163.com
User Type: shanghai
User Age: 25
User Name: 姜总
User Email: jaingzong@163.com
User Type: chongqing
User Age: 29
User Name: 乔克
User Email: qiaoke@163.com
User Type: shenzhen
User Age: 28
User Name: 华仔
User Email: huazai@163.com


当然有时候我们可能不知道要读取的json数据结构,这就没办法预定义结构体,那么我们可以使用**map[string]interface{}**类型来解析json。


var result map[string]interface{}
err = json.Unmarshal(byteValue, &result)
fmt.Printf("%+v\n", result)


输出信息如下:


map[users:[map[address:beijing age:24 name:wanger social:map[email:wanger@163.com mobile:111111]] map[address:chengdu age:30 name:dongdong social:map[emial:dongdong@163.com mobil222222222222222]] map[address:chengdu age:28 name:夏老师 social:map[emial:xialaoshi@163.cmobile:2232222222222222]] map[address:beijing age:30 name:郑哥 social:map[email:zhengge@1com mobile:12222211111]] map[address:shanghai age:25 name:姜总 social:map[email:jaingzong3.com mobile:111122211]] map[address:chongqing age:29 name:乔克 social:map[email:qiaoke@1com mobile:11333331111111]] map[address:shenzhen age:28 name:华仔 social:map[email:huazai3.com mobile:113311111]]]]


生成json文件


func Marshal(v interface{}) ([]byte, error)


package main
import (
 "encoding/json"
 "fmt"
 "io/ioutil"
)
func main() {
 wanger:=User{Address:"beijing",Name:"wanger",Age:24,Social:Social{Email:"wanger@163.com",Mobile:"111111111111"}}
 huazi:=User{Address:"shenzhen",Name:"huazai",Age:28,Social:Social{Email:"huazai@163.com",Mobile:"111122211111"}}
 qiaoke:=User{Address:"chongqing",Name:"qiaoke",Age:30,Social:Social{Email:"qiaoke@163.com",Mobile:"13332211111"}}
 xialaoshi:=User{Address:"chengdu",Name:"夏老师",Age:29,Social:Social{Email:"xialaoshi@163.com",Mobile:"11144445411111"}}
 jiangzong:=User{Address:"shanghai",Name:"姜总",Age:25,Social:Social{Email:"jiangzong@163.com",Mobile:"111222445211111"}}
 dongdong:=User{Address:"chengdu",Name:"冬哥",Age:30,Social:Social{Email:"dongdong@163.com",Mobile:"1155555211111"}}
 zhengge:=User{Address:"beijing",Name:"郑哥",Age:24,Social:Social{Email:"zhengge@163.com",Mobile:"1112224566211111"}}
 result:=Users{Users: []User{wanger,huazi,jiangzong,xialaoshi,qiaoke,dongdong,zhengge}}
 bytearray,err:=json.Marshal(result)
 if err!=nil {
  fmt.Println(err)
 }
 fmt.Println(string(bytearray))
 fileName := "user.json"
 err = ioutil.WriteFile(fileName, bytearray, 0644)
 if err != nil {
  panic("Unable to write data into the file")
 }
}
type Users struct {
 Users []User `json:"users"`
}
type User struct {
 Name string `json:"name"`
 Address string `json:"address"`
 Age int `json:"Age"`
 Social Social `json:"social"`
}
type Social struct {
 Mobile string `json:"mobile"`
 Email string `json:"email"`
}


输出内容如下


{"users":[{"name":"wanger","address":"beijing","Age":24,"social":{"mobile":"111111111111","email":"wanger@163.com"}},{"name":"huazai","address":"shenzhen","Age":28,"social":{"mobile":"111122211111","email":"huazai@163.com"}},{"name":"姜总","address":"shanghai","Age":25,"social":{"mobile":"111222445211111","email":"jiangzong@163.com"}},{"name":"夏老师","address":"chengdu","Age":29,"social":{"mobile":"11144445411111","email":"xialaoshi@163.com"}},{"name":"qiaoke","address":"chongqing","Age":30,"social":{"mobile":"13332211111","email":"qiaoke@163.com"}},{"name":"冬哥","address":"chengdu","Age":30,"social":{"mobile":"1155555211111","email":"dongdong@163.com"}},{"name":"郑哥","address":"beijing","Age":24,"social":{"mobile":"1112224566211111","email":"zhengge@163.com"}}]}


可以看出上面输出的json并不是很美观,可以使用更易读的函数

**json.MarshalIndent()**函数,MarshalIndent()可以定义输出的前缀和缩进


bytearray,err:=json.MarshalIndent(result,""," ")
if err!=nil {
 fmt.Println(err)
}
fmt.Println(string(bytearray))


输出内容如下,比之前看起来好多了


{
 "users": [
  {
   "name": "wanger",
   "address": "beijing",
   "Age": 24,
   "social": {
    "mobile": "111111111111",
    "email": "wanger@163.com"
   }
  },
  {
   "name": "huazai",
   "address": "shenzhen",
   "Age": 28,
   "social": {
    "mobile": "111122211111",
    "email": "huazai@163.com"
   }
  },
  {
   "name": "姜总",
   "address": "shanghai",
   "Age": 25,
   "social": {
    "mobile": "111222445211111",
    "email": "jiangzong@163.com"
   }
  },
  {
   "name": "夏老师",
   "address": "chengdu",
   "Age": 29,
   "social": {
    "mobile": "11144445411111",
    "email": "xialaoshi@163.com"
   }
  },
  {
   "name": "qiaoke",
   "address": "chongqing",
   "Age": 30,
   "social": {
    "mobile": "13332211111",
    "email": "qiaoke@163.com"
   }
  },
  {
   "name": "冬哥",
   "address": "chengdu",
   "Age": 30,
   "social": {
    "mobile": "1155555211111",
    "email": "dongdong@163.com"
   }
  },
  {
   "name": "郑哥",
   "address": "beijing",
   "Age": 24,
   "social": {
    "mobile": "1112224566211111",
    "email": "zhengge@163.com"
   }
  }
 ]
}


解析和生成xml文件


解析xml文件


func Unmarshal(data []byte, v interface{}) error


定义一个user.xml文件


<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user address="beijing">
        <name>wanger</name>
        <age>24</age>
        <social>
            <email>wanger@163.com</email>
            <mobile>1233455464</mobile>
        </social>
    </user>
    <user address="chengdu">
        <name>冬哥</name>
        <age>30</age>
        <social>
            <email>dongge@163.com</email>
            <mobile>12245555464</mobile>
        </social>
    </user>
    <user address="chengdu">
        <name>夏老师</name>
        <age>29</age>
        <social>
            <email>xialaoshi@163.com</email>
            <mobile>12335677464</mobile>
        </social>
    </user>
    <user address="beijing">
        <name>郑哥</name>
        <age>30</age>
        <social>
            <email>zhengge@163.com</email>
            <mobile>12334355464</mobile>
        </social>
    </user>
    <user address="shanghai">
        <name>姜总</name>
        <age>25</age>
        <social>
            <email>jiangzong@163.com</email>
            <mobile>123565455464</mobile>
        </social>
    </user>
    <user address="chongqing">
        <name>乔克</name>
        <age>29</age>
        <social>
            <email>qiaoke@163.com</email>
            <mobile>124676755464</mobile>
        </social>
    </user>
    <user address="shenzhen">
        <name>华仔</name>
        <age>28</age>
        <social>
            <email>huazai@163.com</email>
            <mobile>1238655464</mobile>
        </social>
    </user>
</users>


解析xml文件 address,attr意味着该address字段是一个XML属性而不是一个嵌套元素。如果结构体有一个名为 XMLName 的 Name 类型的字段,Unmarshal 在该字段中记录元素名称。


为了正确解析,go 语言的 xml 包要求 struct 定义中的所有字段必须是可导出的(即首字母大写)


package main
import (
 "encoding/xml"
 "fmt"
 "io/ioutil"
 "os"
)
func main() {
 xmlFile,err:=os.Open("users.xml")
 if err!=nil {
  fmt.Println(err)
 }
 fmt.Println("successfully opened users.xml")
 defer xmlFile.Close()
 byteValue,_:=ioutil.ReadAll(xmlFile)
 var users Users
 xml.Unmarshal(byteValue,&users)
 for i :=0;i<len(users.Users);i++ {
  fmt.Println("User Address: "+users.Users[i].Address)
  fmt.Println("User Name: "+users.Users[i].Name)
  fmt.Println("Facebook Url: "+users.Users[i].Social.Email)
 }
}
type Users struct {
 XMLName xml.Name `xml:"users"`
 Users []User `xml:"user"`
}
type User struct {
 XMLName xml.Name `xml:"user"`
 Address string `xml:"address,attr"`
 Name string `xml:"name"`
 Social Social `xml:"social"`
}
type Social struct {
 XMLName xml.Name `xml:"social"`
 Mobile string `xml:"mobile"`
 Email string `xml:"email"`
}


输出结果如下:


successfully opened users.xml
User Address: beijing
User Name: wanger
Facebook Url: wanger@163.com
User Address: chengdu
User Name: 冬哥
Facebook Url: dongge@163.com
User Address: chengdu
User Name: 夏老师
Facebook Url: xialaoshi@163.com
User Address: beijing
User Name: 郑哥
Facebook Url: zhengge@163.com
User Address: shanghai
User Name: 姜总
Facebook Url: jiangzong@163.com
User Address: chongqing
User Name: 乔克
Facebook Url: qiaoke@163.com
User Address: shenzhen
User Name: 华仔
Facebook Url: huazai@163.com


生成xml文件


func Marshal(v interface{}) ([]byte, error)
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)


可以使用Marshal()函数和MarshalIndent()函数,之前的json和yaml包里也有用到,区别就是MarshalIndent()可以添加 前缀和缩进,看起来更美观一点,Marshal 和MarshalIndent通过编写一个或多个包含数据的 XML 元素来处理所有其他数据。


package main
import (
 "encoding/xml"
 "fmt"
 "io/ioutil"
)
func main() {
 wanger:=User{Address:"beijing",Name:"wanger",Age:24,Social:Social{Email:"wanger@163.com",Mobile:"111111111111"}}
 huazi:=User{Address:"shenzhen",Name:"huazai",Age:28,Social:Social{Email:"huazai@163.com",Mobile:"111122211111"}}
 qiaoke:=User{Address:"chongqing",Name:"qiaoke",Age:30,Social:Social{Email:"qiaoke@163.com",Mobile:"13332211111"}}
 xialaoshi:=User{Address:"chengdu",Name:"夏老师",Age:29,Social:Social{Email:"xialaoshi@163.com",Mobile:"11144445411111"}}
 jiangzong:=User{Address:"shanghai",Name:"姜总",Age:25,Social:Social{Email:"jiangzong@163.com",Mobile:"111222445211111"}}
 dongdong:=User{Address:"chengdu",Name:"冬哥",Age:30,Social:Social{Email:"dongdong@163.com",Mobile:"1155555211111"}}
 zhengge:=User{Address:"beijing",Name:"郑哥",Age:24,Social:Social{Email:"zhengge@163.com",Mobile:"1112224566211111"}}
    v:=&Users{Users: []User{wanger,huazi,qiaoke,xialaoshi,zhengge,jiangzong,dongdong}}
 result, err := xml.MarshalIndent(v, "  ", "    ")
 if err != nil {
  fmt.Printf("error: %v\n", err)
 }
 fmt.Println(string(result))
 fileName := "users.xml"
 err = ioutil.WriteFile(fileName, result, 0644)
 if err != nil {
  panic("Unable to write data into the file")
 }
}
type Users struct {
 XMLName xml.Name `xml:"users"`
 Users []User `xml:"user"`
}
type User struct {
 XMLName xml.Name `xml:"user"`
 Age int64 `xml:"age"`
 Address string `xml:"address,attr"`
 Name string `xml:"name"`
 Social Social `xml:"social"`
}
type Social struct {
 XMLName xml.Name `xml:"social"`
 Mobile string `xml:"mobile"`
 Email string `xml:"email"`
}


输出信息如下


<users>
      <user address="beijing">
          <age>24</age>
          <name>wanger</name>
          <social>
              <mobile>111111111111</mobile>
              <email>wanger@163.com</email>
          </social>
      </user>
      <user address="shenzhen">
          <age>28</age>
          <name>huazai</name>
          <social>
              <mobile>111122211111</mobile>
              <email>huazai@163.com</email>
          </social>
      </user>
      <user address="chongqing">
          <age>30</age>
          <name>qiaoke</name>
          <social>
              <mobile>13332211111</mobile>
              <email>qiaoke@163.com</email>
          </social>
      </user>
      <user address="chengdu">
          <age>29</age>
          <name>夏老师</name>
          <social>
              <mobile>11144445411111</mobile>
              <email>xialaoshi@163.com</email>
          </social>
      </user>
      <user address="beijing">
          <age>24</age>
          <name>郑哥</name>
          <social>
              <mobile>1112224566211111</mobile>
              <email>zhengge@163.com</email>
          </social>
      </user>
      <user address="shanghai">
          <age>25</age>
          <name>姜总</name>
          <social>
              <mobile>111222445211111</mobile>
              <email>jiangzong@163.com</email>
          </social>
      </user>
      <user address="chengdu">
          <age>30</age>
          <name>冬哥</name>
          <social>
              <mobile>1155555211111</mobile>
              <email>dongdong@163.com</email>
          </social>
      </user>
  </users>


文中所有代码已同步到我们的github组织sunsharing-note可阅读原文访问



相关文章
|
4月前
|
XML JSON 编解码
重新认识 Golang 中的 json 编解码
欢迎访问[莹的网络日志](https://lifukun.com),分享技术探索与思考。本文深入解析Go中json编解码特性,涵盖字段映射、omitempty行为、性能对比、自定义编解码及json/v2新特性,助你真正掌握json使用细节。
|
4月前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
282 0
|
11月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
2746 1
|
5月前
|
Linux Go iOS开发
IDA 9.2 发布:Golang 改进、新 UI 组件、类型解析等
IDA Pro 9.2 (macOS, Linux, Windows) - 强大的反汇编程序、反编译器和多功能调试器
1144 0
|
7月前
|
JSON 人工智能 Go
在Golang中序列化JSON字符串的教程
在Golang中,使用`json.Marshal()`可将数据结构序列化为JSON格式。若直接对JSON字符串进行序列化,会因转义字符导致错误。解决方案包括使用`[]byte`或`json.RawMessage()`来避免双引号被转义,从而正确实现JSON的序列化与反序列化。
383 7
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
438 2
|
10月前
|
XML JSON API
如何在 Postman 中上传文件和 JSON 数据
如果你想在 Postman 中同时上传文件和 JSON 数据,本文将带你一步一步地了解整个过程,包括最佳实践和技巧,让你的工作更轻松。
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
3359 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
11月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
440 15
|
开发工具 git 索引
怎么取消对project.private.config.json这个文件的git记录
通过以上步骤,您可以成功取消对 `project.private.config.json`文件的Git记录。这样,文件将不会被包含在未来的提交中,同时仍保留在您的工作区中。
315 28

热门文章

最新文章

推荐镜像

更多