java json数据输出,java服务器端输出JSON格式数据
java服务器端输出JSON格式数据
本文我们讨论如何在服务器端输出 JSON 格式的数据。以 Java 为例,我们将演示将一个 Java 对象编码为 JSON 格式的文本。
将 String 对象编码为 JSON 格式时,只需处理好特殊字符即可。另外,必须用 (“) 而非 (‘) 表示字符串:
static String string2Json(String s) {
StringBuilder sb = new StringBuilder(s.length()+20);
sb.append('\"');
for (int i=0; i
char c = s.charAt(i);
switch (c) {
case '\"':
sb.append("\\\"");
break;
case '\\':
sb.append("\\\\");
break;
case '/':
sb.append("\\/");
break;
case '\b':
sb.append("\\b");
break;
case '\f':
sb.append("\\f");
break;
case '\n':
sb.append("\\n");
break;
case '\r':
sb.append("\\r");
break;
case '\t':
sb.append("\\t");
break;
default:
sb.append(c);
}
}
sb.append('\"');
return sb.toString();
}
[/java]
将 Number 表示为 JSON 就容易得多,利用 Java 的多态,我们可以处理 Integer,Long,Float 等多种 Number 格式:
[java]
static String number2Json(Number number) {
return number.toString();
}
[/java]
Boolean 类型也可以直接通过 toString() 方法得到 JSON 的表示:
[java]
static String boolean2Json(Boolean bool) {
return bool.toString();
}
[/java]
要将数组编码为 JSON 格式,可以通过循环将每一个元素编码出来:
[java]
static String array2Json(Object[] array) {
if (array.length==0)
return "[]";
StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (Object o : array) {
sb.append(toJson(o));
sb.append(',');
}
// 将最后添加的 ',' 变为 ']':
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
[/java]
最后,我们需要将 Map 编码为 JSON 格式,因为 JavaScript 的 Object 实际上对应的是 Java 的 Map 。该方法如下:
[java]
static String map2Json(Map map) {
if (map.isEmpty())
return "{}";
StringBuilder sb = new StringBuilder(map.size() << 4);
sb.append('{');
Set keys = map.keySet();
for (String key : keys) {
Object value = map.get(key);
sb.append('\"');
sb.append(key);
sb.append('\"');
sb.append(':');
sb.append(toJson(value));
sb.append(',');
}
// 将最后的 ',' 变为 '}':
sb.setCharAt(sb.length()-1, '}');
return sb.toString();
}
为了统一处理任意的 Java 对象,我们编写一个入口方法 toJson(Object),能够将任意的 Java 对象编码为 JSON 格式:
public static String toJson(Object o) {
if (o==null)
return "null";
if (o instanceof String)
return string2Json((String)o);
if (o instanceof Boolean)
return boolean2Json((Boolean)o);
if (o instanceof Number)
return number2Json((Number)o);
if (o instanceof Map)
return map2Json((Map)o);
if (o instanceof Object[])
return array2Json((Object[])o);
throw new RuntimeException("Unsupported type: " + o.getClass().getName());
}
我们并未对 Java 对象作严格的检查。不被支持的对象(例如 List)将直接抛出 RuntimeException 。此外,为了保证输出的 JSON 是有效的,Map对象的 Key 也不能包含特殊字符。细心的读者可能还会发现循环引用的对象会引发无限递归,例如,精心构造一个循环引用的 Map,就可以检测到 StackOverflowException:
@Test(expected=StackOverflowError.class)
public void testRecurrsiveMap2Json() {
Map map = new HashMap();
map.put("key", map);
JsonUtil.map2Json(map);
}
好在服务器处理的 JSON 数据最终都应该转化为简单的 JavaScript 对象,因此,递归引用的可能性很小。
最后,通过 Servlet 或 MVC 框架输出 JSON 时,需要设置正确的 MIME 类型(application/json)和字符编码。假定服务器使用 UTF-8 编码,则可以使用以下代码输出编码后的 JSON 文本:
response.setContentType("application/json;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
pw.write(JsonUtil.toJson(obj));
pw.flush();
java json数据输出,java服务器端输出JSON格式数据相关推荐
- Python数据处理(一):处理 JSON、XML、CSV 三种格式数据
Python 数据处理系列博客来啦! 本系列将以<Python数据处理>这本书为基础,以书中每章一篇博客的形式带大家一起学习 Python 数据处理.书中有些地方讲的不太详细,我会查阅其他 ...
- python读取mat数据_Python几种读取mat格式数据的方法,python几种读取mat
Python几种读取mat格式数据的方法,python几种读取mat matlab中使用的数据一般会以mat的格式存储,用python读取有以下几种方法 1.使用scipy,具体实现如下: impor ...
- cesium 3dtiles 加载本地数据_记一次Cesium地形数据生成过程
问题描述 有一小块带高程值的点状数据,需要根据该数据生成Cesium支持的3dtiles数据,在Cesium中显示.经过一周多时间的摸索,终于能够在Cesium中加载成功.现将数据处理流程做个记录,以 ...
- VCT空间数据交换格式数据的检测方法研究
摘要:国土资源信大量的是空间地理信息,由于现买中各GIS系统存储.管理GIS数据的格式各不相同,空间数据交换标准是实现GIS数据共享的必要途径,国土资源部制定了VCT矢量数据交换格式来实现各类国土资源 ...
- 【Atlas500】入门到放弃(六)——【DVPP】浅析HFBC格式数据存在的意义
转载自:https://bbs.huaweicloud.com/blogs/156199, 作者:山人 [摘要] HFBC格式是一种数据压缩格式,是VDEC解码后输出的每一帧数据的格式(Hisi Fr ...
- 【iOS】Socket/TCP 通信 发送 NSString 字符串格式数据
Socket/TCP 原理这里就不阐述了,网上一搜一大堆,直接上关键代码. [注]iOS 目前有非常著名的第三方库 CocoaAsyncSocket 可以使用,但是我们项目当时做大数据上报要求直接发送 ...
- lsdyna如何设置set中的node_list_如何使用Python处理HDF格式数据
HDF也是一种自描述格式文件,主要用于存储和分发科学数据.气象领域中卫星数据经常使用此格式,比如MODIS,OMI,LIS/OTD等卫星产品.对HDF格式细节感兴趣的可以Google了解一下. 这一次 ...
- netcdf geotiff java_R-NC格式数据转GeoTIFF
0. 问题导入 目前,很多地理数据均存储为NetCDF格式(下简称NC格式),而往往内含多变量,不方便处理.其中,一种解决思路就是将NC格式文件中的多个变量数据转格式为单变量的GeoTiff文件(图1 ...
- MySQL LOAD DATA INFILE 导入 CSV 格式数据
主要介绍将 Neo4j 数据库中数据全部导入到 MySQL 数据库中,将 Neo4j 数据导出为 CSV 格式数据,然后再将 CSV 格式数据导入到 mysql 中. 前半部分,即 Neo4j 数据导 ...
最新文章
- Cesium调用天地图的新问题
- shujufenxi:一季度中国人每天存700亿元!“报复性存款”能带来消费吗?
- 201621123079《java程序设计》第六周作业总结
- Windows7中启动Mysql服务时提示:拒绝访问的一种解决方式
- Qt设置QWidget背景色4种方法
- java8 函数式编程_Java 8函数式编程:延迟实例化
- VM Ware 虚拟机centos 时间与本地时间不一致
- vue动态监听窗口高度 - 全背景banner
- 01-python进阶-拾遗
- 两台主机经过路由器传送数据的网络原理
- Kubernetes Service详解(概念、原理、流量分析、代码)
- opendrive中的Road
- 生产排程系统_ASPROVA:工序排程软件的全球隐形冠军
- 如何提炼游戏IP的价值,《梦幻西游三维版》给我们上了一课
- java程序员面试简历注意事项
- Java教程:使用POI读取excel文档(根据BV1bJ411G7Aw整理)
- 电动汽车整车控制SIMULINK仿真
- FX5U和je-C伺服通讯案例和学习资料
- K8S实战基础篇:一文带你深入了解K8S实战部署SpringBoot项目
- Redis项目应用场景与实例(三):队列(List)
热门文章
- R语言aggregate函数数据聚合实战
- 句法分析常用算法框架以及NLPIR、Dependency Viwer
- 特征工程之MinMaxScaler、StandardScaler、Normalizer、Binarizer
- 影像组学视频学习笔记(30)-SMOTE解决数据不平衡的问题、Li‘s have a solution and plan.
- catboost是什么?相对于xgboost以及lightgbm有什么优势?如何使用randomSearchCV和Catboost进行组合获取最优参数组合?
- ubuntu 刷 android 5.0,IT之家学院:将刷了Ubuntu Touch的魅族PRO 5恢复为安卓系统
- python colormap函数_python-使用由x,y位置定义的rgb值创建colormap
- 计算机教案计算机的组成,计算机的组成 教案
- Java枚举意义在哪_java – 多个if-else或枚举 – 哪一个更好,为什么?
- AI 利用BP算法及Sigmoid函数,研究函数f(x)=2sinx-0.7的逼近问题-实验报告