FastJSON在Scala中的应用

本文介绍如何在Scala项目中使用阿里云FastJSON库解析JSON字符串。包括配置Maven依赖、解析JSON对象与数组,并获取特定字段的值。

首先需要在pom.xml中加入依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.23</version>
 </dependency>
package online.daliang.learning

import com.alibaba.fastjson.JSON

/**
  * @author daliang on 2018/9/17
  */
object fastJson {
  def main(args: Array[String]): Unit = {
    val jsonString = "{\"et\":\"kanqiu_client_join\",\"vtm\":1435898329434,\"body\":{\"client\":\"866963024862254\",\"client_type\":\"android\",\"room\":\"NBA_HOME\",\"gid\":\"\",\"type\":\"\",\"roomid\":\"\"}," +
      "\"time\":[{\"arrayKey\":\"arrayVal\"},{\"key2\":\"val2\"}]}"
    println("Json String:--------")
    println(jsonString)
    println(jsonString.getClass)
    val json = JSON.parseObject(jsonString)
    println("Parse Json:--------")
    println(json)
    println(json.getClass)
    println(json.getInteger("vtm"))
    println(json.getString("et"))
    println(json.getJSONObject("body"))
    println(json.getJSONObject("body").getClass)
    println(json.getJSONObject("body").getString("client"))

    println("---------Array------------")
    println(json.get("time"))
    println(json.get("time").getClass)
    println(json.getJSONArray("time"))
    println(json.getJSONArray("time").getClass)

    println(json.getJSONArray("time").get(0))
    println(json.getJSONArray("time").get(0).getClass)
    println(json.getJSONArray("time").getJSONObject(0))
    println(json.getJSONArray("time").getJSONObject(0).getClass)

    println(json.getJSONArray("time").get(0))  //虽然都是JSONObject,但这个没有 get 方法
    //Error:(36, 46) value get is not a member of Object
    //    println(json.getJSONArray("time").get(0).get("arrayKey"))  //虽然都是JSONObject,但这个没有 get 方法
    println(json.getJSONArray("time").get(0).getClass)
    println(json.getJSONArray("time").getJSONObject(0).get("arrayKey"))   //虽然都是JSONObject,有 get 方法
    println(json.getJSONArray("time").getJSONObject(0).get("arrayKey").getClass)
  }

}

输出结果:

Json String:--------
{"et":"kanqiu_client_join","vtm":1435898329434,"body":{"client":"866963024862254","client_type":"android","room":"NBA_HOME","gid":"","type":"","roomid":""},"time":[{"arrayKey":"arrayVal"},{"key2":"val2"}]}
class java.lang.String
Parse Json:--------
{"body":{"client":"866963024862254","client_type":"android","gid":"","room":"NBA_HOME","roomid":"","type":""},"et":"kanqiu_client_join","time":[{"arrayKey":"arrayVal"},{"key2":"val2"}],"vtm":1435898329434}
class com.alibaba.fastjson.JSONObject
1379252570
kanqiu_client_join
{"client":"866963024862254","client_type":"android","gid":"","room":"NBA_HOME","roomid":"","type":""}
class com.alibaba.fastjson.JSONObject
866963024862254
---------Array------------
[{"arrayKey":"arrayVal"},{"key2":"val2"}]
class com.alibaba.fastjson.JSONArray
[{"arrayKey":"arrayVal"},{"key2":"val2"}]
class com.alibaba.fastjson.JSONArray
{"arrayKey":"arrayVal"}
class com.alibaba.fastjson.JSONObject
{"arrayKey":"arrayVal"}
class com.alibaba.fastjson.JSONObject
{"arrayKey":"arrayVal"}
class com.alibaba.fastjson.JSONObject
arrayVal
class java.lang.String

Process finished with exit code 0
### 如何使用 FastJSON 获取 JSON 数据中的FastJSON 是阿里巴巴开源的一个高性能 JSON 解析库,广泛应用于 Java 和 Scala 开发中。以下是关于如何通过 FastJSON 获取 JSON 数据中的具体值的详细介绍。 #### 使用 `JSONObject` 和 `JSONArray` 获取简单 JSON 值 如果目标是一个简单的 JSON 对象或者数组,可以通过以下方式获取: ```java // 将 JSON 字符串转换为 JSONObject String jsonString = "{\"name\":\"张三\", \"age\":23}"; JSONObject jsonObject = JSONObject.parseObject(jsonString); // 获取指定键对应的值 String name = jsonObject.getString("name"); int age = jsonObject.getIntValue("age"); System.out.println("Name: " + name); // 输出 Name: 张三 System.out.println("Age: " + age); // 输出 Age: 23 ``` 此方法适用于单层 JSON 结构[^1]。 --- #### 处理嵌套 JSON 的情况 当遇到多层嵌套的 JSON 数据时,可以逐级访问每一层的对象或数组。例如: ```java String nestedJsonString = "{" + "\"property\": {" + " \"events\": [" + " {\"data\": {\"b\": {\"b1\": \"valueB1\"}}}" + " ]" + "}}" ; // 转换为 JSONObject 并逐步提取数据 JSONObject rootJsonObject = JSONObject.parseObject(nestedJsonString); JSONObject property = rootJsonObject.getJSONObject("property"); JSONArray events = property.getJSONArray("events"); JSONObject firstEvent = events.getJSONObject(0); JSONObject data = firstEvent.getJSONObject("data"); JSONObject b = data.getJSONObject("b"); String b1 = b.getString("b1"); System.out.println("Nested Value: " + b1); // 输出 Nested Value: valueB1 ``` 这种方法展示了如何处理复杂的嵌套结构并最终定位到所需的值[^4]。 --- #### 遍历 JSON 数组 对于包含多个元素的 JSON 数组,可以遍历每个元素并逐一操作。例如: ```java String jsonArrayString = "[{\"key\": 10}, {\"key\": 20}, {\"key\": 15}, {\"key\": 5}]"; JSONArray jsonArray = JSONArray.parseArray(jsonArrayString); for (int i = 0; i < jsonArray.size(); i++) { int key = jsonArray.getJSONObject(i).getIntValue("key"); System.out.println("Key at index " + i + ": " + key); } ``` 这段代码会依次打印出数组中每个对象的 `"key"` 值[^2]。 --- #### 自定义类映射 除了直接操作 JSON 键值对外,还可以将 JSON 数据反序列化为自定义的 Java 或 Scala 类型。这通常用于更复杂的应用场景。例如: ```scala import com.alibaba.fastjson.JSON case class User(name: String, age: Int) val jsonStr = """{"name":"张三", "age":23}""" val user: User = JSON.parseObject(jsonStr, classOf[User]) println(s"Name: ${user.name}, Age: ${user.age}") ``` 这种方式不仅提高了可读性,还便于后续业务逻辑开发[^3]。 --- ### 总结 - 单层 JSON 可以直接通过 `getString`, `getIntValue` 等方法快速获取。 - 嵌套 JSON 则需按层次逐步解析至目标节点。 - 如果涉及大量重复数据(如数组),建议采用循环机制批量处理。 - 当数据模型较为固定时,推荐利用自定义类完成自动映射。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值