58. (android開發(fā))Json文件的讀寫

Json格式是常見(jiàn)的讀寫形式陈哑。讀寫Json文件也是常用的操作容诬。
這次來(lái)實(shí)踐一下Json文件的讀寫。
首先在SD卡上的讀寫權(quán)限是一定要申請(qǐng)的碟渺。那么還是老辦法,在 AndroidManifest.xml 文件中添加 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
這在android 6.0 以下的系統(tǒng)就足夠了突诬。6.0及以上的更新的系統(tǒng)苫拍,在代碼中需要申請(qǐng)SD卡的讀寫權(quán)限。
先來(lái)構(gòu)建界面旺隙,兩個(gè)按鈕一個(gè)文字顯示組件绒极。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.cofox.functions.ReadWriteJsonData.ReadWriteJsonDataActivity">

    <Button
        android:id="@+id/btnSingleWJson"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="獨(dú)立寫Json文件" />

    <Button
        android:id="@+id/btnSingleRJson"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="獨(dú)立讀JSON文件" />

    <TextView
        android:id="@+id/ttvwJson"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:textSize="20sp"/>
</LinearLayout>

默認(rèn)界面

在onCreate方法中增加按鈕動(dòng)作

// 獨(dú)立寫Json文件
        btnSingleWJson.setOnClickListener {
}
// 獨(dú)立讀Json文件
        btnSingleRJson.setOnClickListener{
}

寫入Json文件要先判斷SD卡的讀寫權(quán)限,沒(méi)權(quán)限要申請(qǐng)權(quán)限蔬捷,如果有權(quán)限才執(zhí)行寫操作集峦。

        // 獨(dú)立寫Json文件
        btnSingleWJson.setOnClickListener {
            // 判斷有無(wú)寫SD卡的權(quán)限
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                //申請(qǐng)寫 SD 卡的權(quán)限
                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), COFOX_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE)
            } else {
                saveSingleJson()
            }
        }

這其中的saveSingleJson()方法是具體的寫Json的實(shí)現(xiàn)。

fun saveSingleJson(){
        Toast.makeText(this, "保存獨(dú)立Json文件", Toast.LENGTH_LONG).show()
        //打開要寫入的json文件
        val fos = FileOutputStream(jsonFile)
        //json數(shù)據(jù)
        val products = arrayListOf<Product>()
        products.add(Product("0001", "微服務(wù)核心服務(wù)端"))
        products.add(Product("0002", "平臺(tái)管理android端"))
        products.add(Product("0003", "平臺(tái)管理web端"))
        products.add(Product("0004", "企業(yè)用戶android端"))
        products.add(Product("0005", "終端用戶wx/android/web端"))
        products.add(Product("0006", "android全功能端"))
        products.add(Product("0007", "明月端"))
        //創(chuàng)建JsonWrite對(duì)象
        val writer = JsonWriter(OutputStreamWriter(fos, "utf-8"))
        writer.setIndent("    ")
        writer.beginArray()
        for (product in products){
            writer.beginObject()
            writer.name("id").value(product.id)
            writer.name("name").value(product.name)
            writer.endObject()
        }
        writer.endArray()
        writer.close()
    }

注意writer.close()不能丟失抠刺,不然你就寫不到文件里了。
代碼中的Json文件保存位置存放在一個(gè)變量中
val jsonFile = "/sdcard/cofoxtest.json"
讀取Json文件摘昌,一個(gè)對(duì)列表的記錄進(jìn)行循環(huán)讀取速妖,一個(gè)是對(duì)記錄內(nèi)的字段循環(huán)讀取,兩個(gè)循環(huán)嵌套聪黎。

        // 獨(dú)立讀Json文件
        btnSingleRJson.setOnClickListener {
            val fis = FileInputStream(jsonFile)
            var reader = JsonReader(InputStreamReader(fis,"utf-8"))
            val products = ArrayList<Product>()
            reader.beginArray()
            while (reader.hasNext()){
                var id = ""
                var name = ""
                reader.beginObject()
                while (reader.hasNext()) {
                    var field = reader.nextName()
                    if (field.equals("id")){
                        id = reader.nextString()
                    }else if (field.equals("name")){
                        name = reader.nextString()
                    }else{
                        reader.skipValue()
                    }
                }
                reader.endObject()
                products.add(Product(id, name))
            }
            reader.endArray()
            reader.close()

            if (products != null) {
                var result = ""
                for (product in products) {
                    result += "id:" + product.id + " name:" + product.name + "\n"
                    ttvwJson.setText(result)
                }
            }
        }

如果是高版本的android罕容,第一次運(yùn)行,會(huì)對(duì)權(quán)限做一個(gè)判斷稿饰,根據(jù)操作人的權(quán)限賦予的選擇锦秒,有一個(gè)相應(yīng)的系統(tǒng)反應(yīng)。這就是權(quán)限選擇結(jié)果的一個(gè)方法重寫喉镰。如果同意了權(quán)限就寫入旅择,如果不同意就顯示提示信息。

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        when (requestCode) {
            COFOX_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE -> {
                if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    saveSingleJson()
                } else {
                    Toast.makeText(this, "您拒絕了寫入", Toast.LENGTH_LONG).show()
                }
            }
        }
    }
界面

保存Json

生成文件
顯示Json
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侣姆,一起剝皮案震驚了整個(gè)濱河市生真,隨后出現(xiàn)的幾起案子沉噩,更是在濱河造成了極大的恐慌,老刑警劉巖柱蟀,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件川蒙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡长已,警方通過(guò)查閱死者的電腦和手機(jī)畜眨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)术瓮,“玉大人康聂,你說(shuō)我怎么就攤上這事〗锔” “怎么了早抠?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)撬讽。 經(jīng)常有香客問(wèn)我蕊连,道長(zhǎng),這世上最難降的妖魔是什么游昼? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任甘苍,我火速辦了婚禮,結(jié)果婚禮上烘豌,老公的妹妹穿的比我還像新娘载庭。我一直安慰自己,他們只是感情好廊佩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布囚聚。 她就那樣靜靜地躺著,像睡著了一般标锄。 火紅的嫁衣襯著肌膚如雪顽铸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天料皇,我揣著相機(jī)與錄音谓松,去河邊找鬼。 笑死践剂,一個(gè)胖子當(dāng)著我的面吹牛鬼譬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逊脯,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼优质,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了军洼?” 一聲冷哼從身側(cè)響起盆赤,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贾富,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后牺六,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颤枪,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年淑际,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畏纲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡春缕,死狀恐怖盗胀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锄贼,我是刑警寧澤票灰,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站宅荤,受9級(jí)特大地震影響屑迂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冯键,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一惹盼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惫确,春花似錦手报、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至陈肛,卻和暖如春盏档,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背燥爷。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懦窘,地道東北人前翎。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像畅涂,于是被迫代替她去往敵國(guó)和親港华。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容