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格式数据相关推荐

  1. Python数据处理(一):处理 JSON、XML、CSV 三种格式数据

    Python 数据处理系列博客来啦! 本系列将以<Python数据处理>这本书为基础,以书中每章一篇博客的形式带大家一起学习 Python 数据处理.书中有些地方讲的不太详细,我会查阅其他 ...

  2. python读取mat数据_Python几种读取mat格式数据的方法,python几种读取mat

    Python几种读取mat格式数据的方法,python几种读取mat matlab中使用的数据一般会以mat的格式存储,用python读取有以下几种方法 1.使用scipy,具体实现如下: impor ...

  3. cesium 3dtiles 加载本地数据_记一次Cesium地形数据生成过程

    问题描述 有一小块带高程值的点状数据,需要根据该数据生成Cesium支持的3dtiles数据,在Cesium中显示.经过一周多时间的摸索,终于能够在Cesium中加载成功.现将数据处理流程做个记录,以 ...

  4. VCT空间数据交换格式数据的检测方法研究

    摘要:国土资源信大量的是空间地理信息,由于现买中各GIS系统存储.管理GIS数据的格式各不相同,空间数据交换标准是实现GIS数据共享的必要途径,国土资源部制定了VCT矢量数据交换格式来实现各类国土资源 ...

  5. 【Atlas500】入门到放弃(六)——【DVPP】浅析HFBC格式数据存在的意义

    转载自:https://bbs.huaweicloud.com/blogs/156199, 作者:山人 [摘要] HFBC格式是一种数据压缩格式,是VDEC解码后输出的每一帧数据的格式(Hisi Fr ...

  6. 【iOS】Socket/TCP 通信 发送 NSString 字符串格式数据

    Socket/TCP 原理这里就不阐述了,网上一搜一大堆,直接上关键代码. [注]iOS 目前有非常著名的第三方库 CocoaAsyncSocket 可以使用,但是我们项目当时做大数据上报要求直接发送 ...

  7. lsdyna如何设置set中的node_list_如何使用Python处理HDF格式数据

    HDF也是一种自描述格式文件,主要用于存储和分发科学数据.气象领域中卫星数据经常使用此格式,比如MODIS,OMI,LIS/OTD等卫星产品.对HDF格式细节感兴趣的可以Google了解一下. 这一次 ...

  8. netcdf geotiff java_R-NC格式数据转GeoTIFF

    0. 问题导入 目前,很多地理数据均存储为NetCDF格式(下简称NC格式),而往往内含多变量,不方便处理.其中,一种解决思路就是将NC格式文件中的多个变量数据转格式为单变量的GeoTiff文件(图1 ...

  9. MySQL LOAD DATA INFILE 导入 CSV 格式数据

    主要介绍将 Neo4j 数据库中数据全部导入到 MySQL 数据库中,将 Neo4j 数据导出为 CSV 格式数据,然后再将 CSV 格式数据导入到 mysql 中. 前半部分,即 Neo4j 数据导 ...

最新文章

  1. Cesium调用天地图的新问题
  2. shujufenxi:一季度中国人每天存700亿元!“报复性存款”能带来消费吗?
  3. 201621123079《java程序设计》第六周作业总结
  4. Windows7中启动Mysql服务时提示:拒绝访问的一种解决方式
  5. Qt设置QWidget背景色4种方法
  6. java8 函数式编程_Java 8函数式编程:延迟实例化
  7. VM Ware 虚拟机centos 时间与本地时间不一致
  8. vue动态监听窗口高度 - 全背景banner
  9. 01-python进阶-拾遗
  10. 两台主机经过路由器传送数据的网络原理
  11. Kubernetes Service详解(概念、原理、流量分析、代码)
  12. opendrive中的Road
  13. 生产排程系统_ASPROVA:工序排程软件的全球隐形冠军
  14. 如何提炼游戏IP的价值,《梦幻西游三维版》给我们上了一课
  15. java程序员面试简历注意事项
  16. Java教程:使用POI读取excel文档(根据BV1bJ411G7Aw整理)
  17. 电动汽车整车控制SIMULINK仿真
  18. FX5U和je-C伺服通讯案例和学习资料
  19. K8S实战基础篇:一文带你深入了解K8S实战部署SpringBoot项目
  20. Redis项目应用场景与实例(三):队列(List)

热门文章

  1. R语言aggregate函数数据聚合实战
  2. 句法分析常用算法框架以及NLPIR、Dependency Viwer
  3. 特征工程之MinMaxScaler、StandardScaler、Normalizer、Binarizer
  4. 影像组学视频学习笔记(30)-SMOTE解决数据不平衡的问题、Li‘s have a solution and plan.
  5. catboost是什么?相对于xgboost以及lightgbm有什么优势?如何使用randomSearchCV和Catboost进行组合获取最优参数组合?
  6. ubuntu 刷 android 5.0,IT之家学院:将刷了Ubuntu Touch的魅族PRO 5恢复为安卓系统
  7. python colormap函数_python-使用由x,y位置定义的rgb值创建colormap
  8. 计算机教案计算机的组成,计算机的组成 教案
  9. Java枚举意义在哪_java – 多个if-else或枚举 – 哪一个更好,为什么?
  10. AI 利用BP算法及Sigmoid函数,研究函数f(x)=2sinx-0.7的逼近问题-实验报告