Java中的JSON处理与WebSocket应用
立即解锁
发布时间: 2025-08-18 02:36:48 阅读量: 2 订阅数: 5 

NetBeans 8助力Java EE 7企业应用开发
### Java 中的 JSON 处理与 WebSocket 应用
#### 1. Java API for JSON Processing
在处理 JSON 数据时,我们经常需要对其进行生成和解析操作。以下将详细介绍如何使用 Java API for JSON Processing 来完成这些任务。
##### 1.1 JSON 数据生成的结束操作
当我们向 JSON 数据添加完属性后,需要调用 `JsonGenerator` 的 `writeEnd()` 方法。这个方法会向我们的 JSON 字符串添加 JSON 对象结束字符(用右花括号 `}` 表示)。此时,我们传递给 `Json.createGenerator()` 的 `Writer` 或 `OutputStream` 就包含了一个完整的 JSON 对象。下面是示例代码:
```java
// 假设已经完成 JSON 属性添加
JsonGenerator jsonGenerator = ...;
jsonGenerator.writeEnd();
```
##### 1.2 使用 JSON - P 流式 API 解析 JSON 数据
以下是一个使用 JSON - P 流式 API 解析 JSON 数据的示例:
```java
package com.ensode.jsonpstreamingapi;
// imports 省略
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.json.Json;
import javax.json.JsonParser;
import javax.json.stream.JsonParser.Event;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;
@Named
@RequestScoped
public class JsonPStreamingApiBean {
@Inject
private Person person;
private String jsonStr;
public String parseJson() {
StringReader stringReader = new StringReader(jsonStr);
JsonParser jsonParser = Json.createParser(stringReader);
Map<String, Object> jsonMap = new HashMap<>();
String jsonKeyNm = null;
Object jsonVal = null;
while (jsonParser.hasNext()) {
JsonParser.Event event = jsonParser.next();
if (event.equals(Event.KEY_NAME)) {
jsonKeyNm = jsonParser.getString();
} else if (event.equals(Event.VALUE_STRING)) {
jsonVal = jsonParser.getString();
} else if (event.equals(Event.VALUE_NUMBER)) {
jsonVal = jsonParser.getInt();
}
jsonMap.put(jsonKeyNm, jsonVal);
}
person.setFirstName((String) jsonMap.get("firstName"));
person.setMiddleName((String) jsonMap.get("middleName"));
person.setLastName((String) jsonMap.get("lastName"));
person.setGender((String) jsonMap.get("gender"));
person.setAge((Integer) jsonMap.get("age"));
return "display_populated_obj";
}
}
```
操作步骤如下:
1. 首先,我们需要获取 `JsonParser` 接口的实现。`Json` 类有两个重载的 `createParser()` 方法,一个接受 `java.io.InputStream` 实例,另一个接受 `java.io.Reader` 实例。在示例中,我们使用了接受 `java.io.Reader` 实例的方法,并传入包含 JSON 字符串的 `java.io.StringReader` 实例。
2. 获取 `JsonParser` 引用后,在 `while` 循环中调用其 `hasNext()` 方法。如果 JSON 字符串中还有更多属性名或值需要读取,该方法返回 `true`,否则返回 `false`。
3. 在 `while` 循环内部,调用 `JsonParser.next()` 方法,该方法返回 `JsonParser.Event` 枚举的实例。通过这个枚举值,我们可以知道正在读取的数据类型(键名、字符串值、数值等)。
4. 根据不同的 `Event` 类型,我们将读取到的键值对存储到 `jsonMap` 中,最后根据 `jsonMap` 中的值设置 `person` 对象的属性。
##### 1.3 JsonParser.Event 枚举的可能值
| Event enum Value | Description |
| --- | --- |
| Event.START_OBJECT | 表示 JSON 对象的开始 |
| Event.END_OBJECT | 表示 JSON 对象的结束 |
| Event.KEY_NAME | 表示 JSON 属性的名称 |
| Event.VALUE_STRING | 表示读取到了字符串值 |
| Event.VALUE_NUMBER | 表示读取到了数值 |
| Event.VALUE_TRUE | 表示读取到了布尔值 `true` |
| Event.VALUE_FALSE | 表示读取到了布尔值 `false` |
| Event.VALUE_NULL | 表示读取到了 `null` 值 |
| Event.VALUE_START_ARRAY | 表示读取到了数组的开始 |
| EVENT.VALUE_END_ARRAY | 表示读取到了数组的结束 |
#### 2. Java API for WebSocket
传统的 Web 应用采用请求/响应模型,而 WebSocket 是一种新的 HTML5 技术,它允许客户端(通常是 Web 浏览器)和服务器之间进行双向、全双工通信,即服务器可以在不等待 HTTP 请求的情况下实时向浏览器发送数据。Java EE 7 全面支持开发 WebSocket 应用,NetBeans 也提供了一些功能,使开发 WebSocket Java EE 应用更加容易。
##### 2.1 使用 NetBeans 中的示例项目查看 WebSocket 代码
NetBeans 包含许多示例项目,其中一个特别有用的示例是使用 WebSocket 在浏览器上输出服务器数据的 Echo 应用程序。创建示例项目的步骤如下:
1. 选择 `File | New Project`。
2. 在 `Categories` 中选择 `Samples` 下的 `Java EE`。
3. 在 `Projects` 中选择 `Echo WebSocket (Java EE 7)`。
4. 在向导的下一个屏幕中,选择项目位置或接受默认位置。
5. 点击 `Finish`,项目即创建完成。
##### 2.2 示例 Echo 应用程序的运行
我们可以通过右键单击项目并选择 `Run` 来运行示例 Echo 应用程序。点击 `Run` 几秒钟后,浏览器会弹出并自动运行应用程序。文本输入字段会自动预填充 `Hello WebSocket!`,点击 `Press me` 按钮会将文本发送到 WebSocket 服务器端点,服务器端点会将文本原样返回给客户端。
##### 2.3 生成的 Java 代码分析
生成的 WebSocket 服务器端点的 Java 源代码如下:
```java
package org.glassfish.samples.websocket.echo;
import javax.websocket.OnMessage;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/echo")
public class EchoEndpoint {
@OnMessage
public String echo(String message) {
return message;
}
}
```
- 处理 WebSocket 请求的 Java 类称为服务器端点。通过使用 `@ServerEndpoint` 注解可以将一个 Java 类指定为服务器端点,其 `value` 属性表示服务器端点的统一资源标识符(URI),客户端通过这个 URI 访问服务器端点。
- 任何使用 `@OnMessage` 注解的方法,每当客户端向 WebSocket 服务器端点发送消息时都会自动调用。该方法接受一个字符串参数,包含客户端发送的消息内容。在这个简单的示例中,该方法直接将接收到的消息返回给客户端。
##### 2.4 生成的 JavaScript 代码分析
以下是包含嵌入式 JavaScript 的 HTML 文件代码:
```html
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<
```
0
0
复制全文


