神谕最终幻想占星星系统怎样玩 占星系统玩法攻略

活用fastjson序列化和反序列化含枚举类型java对象
活用fastjson序列化和反序列化含枚举类型java对象
来源:极客头条
在使用fastjson对java对象进行序列化和反序列化时,如果含有枚举类型,默认会根据枚举变量的ordinal值进行反序列且序列化时显示枚举字面代表的字符串。经常这种行为不是我们想要的,那么如何进行定制化枚举类型的序列化和反序列? 举例如下
假设待序列化和反序列化java对象结构如下
public class Msg {
private StatusCodeE
public int getId() {
public void setId(int id) {
public StatusCodeEnum getStatus() {
public void setStatus(StatusCodeEnum status) {
this.status =
public static enum StatusCodeEnum {
OK(200, ), SERVER_ERROR(500, );
private static final Map&Integer, StatusCodeEnum& CODE_MAP = new HashMap&Integer, StatusCodeEnum&();
for (StatusCodeEnum typeEnum : StatusCodeEnum.values()) {
CODE_MAP.put(typeEnum.getCode(), typeEnum);
StatusCodeEnum(int code, String meaning) {
this.code =
this.meaning =
public int getCode() {
public String getMeaning() {
public static StatusCodeEnum getEnum(Integer code) {
return CODE_MAP.get(code);
private final S
对象内部定义了状态码枚举类StatusCodeEnum,包含两个实例OK、SERVER_ERROR。
反序列化问题
如何使用fastjson成功反序列如下json串?
{“id”:1,”status”:200}
显然,如果直接用Json.parseObject()方法进行反序列化,会报如下错误信息:
Exception in thread “main” com.alibaba.fastjson.JSONException: parse
enum com.netwaymedia.mon.dto.Msg$StatusCodeEnum
error, value : 200
com.alibaba.fastjson.parser.deserializer.EnumDeserializer.deserialze(EnumDeserializer.java:48)
com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:33)
原因分析:前面已经提过,fastjson默认使用ordinal值去查找对应的枚举实例,显示是获取不到的,所以抛出异常,需要修改status值为0才运行OK。
序列化问题
如果使用JSON.toJSONString()方法对上述Msg对象进行序列化,会得到如下json串
{“id”:1,”status”:”OK”}
显示不是我们所期待的原始字符串
{“id”:1,”status”:200}
如何解决上述两大问题?
优雅的解决方案
答案就在于fastjson提供注解JSONField。通过JSONField可灵活控制字段的序列化和反序列,重新修改Msg结构如下:
public class Msg {
private StatusCodeEnum statusC
public int getId() {
public void setId(int id) {
@JSONField(name = )
public int getStatus() {
return statusCode.getCode();
@JSONField(name = )
public void setStatus(int code) {
this.statusCode = StatusCodeEnum.getEnum(code);
@JSONField(serialize = false)
public StatusCodeEnum getStatusCode() {
return statusC
@JSONField(deserialize = false)
public void setStatusCode(StatusCodeEnum statusCode) {
this.statusCode = statusC
public static enum StatusCodeEnum {
OK(200, ), BAD_REQUEST(400, );
private static final Map&Integer, StatusCodeEnum& CODE_MAP = new HashMap&Integer, StatusCodeEnum&();
for (StatusCodeEnum typeEnum : StatusCodeEnum.values()) {
CODE_MAP.put(typeEnum.getCode(), typeEnum);
StatusCodeEnum(int code, String meaning) {
this.code =
this.meaning =
public int getCode() {
public String getMeaning() {
public static StatusCodeEnum getEnum(Integer code) {
return CODE_MAP.get(code);
private final S
思路是通过修改字段名为statusCod
思路是通过修改字段名为statusCode,并用JSONField注解该字段不进行序列和反序列化,但是提供getStatus/setStatus方法来定制化枚举变量statusCode的序列和反序列,完美的解决前面提到的两大问题。
即使是一小步也想与你分享JSON 之FastJson解析 - 百威 - ITeye技术网站
博客分类:
阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:
速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。包括自称最快的JackJson;
功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省;无依赖,能够直接运行在Java SE 5.0以上版本;支持Android;开源 (Apache 2.0)
Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final
T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final
List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray
二、FastJson解析JSON步骤
&& A、服务器端将数据转换成json字符串
&&&&& 首先、服务器端项目要导入阿里巴巴的fastjson的jar包至builtPath路径下(这些可以到fastjson官网下载:/wiki/display/FastJSON/Home-zh)
然后将数据转为json字符串,核心函数是:
public static String createJsonString(Object value)
String alibabaJson = JSON.toJSONString(value);
return alibabaJ
B、客户端将json字符串转换为相应的javaBean
& 首先客户端也要导入fastjson的两个jar包
1、客户端获取json字符串
public class HttpUtil
public static String getJsonContent(String urlStr)
{// 获取HttpURLConnection连接对象
URL url = new URL(urlStr);
HttpURLConnection httpConn = (HttpURLConnection) url
.openConnection();
// 设置连接属性
httpConn.setConnectTimeout(3000);
httpConn.setDoInput(true);
httpConn.setRequestMethod("GET");
// 获取相应码
int respCode = httpConn.getResponseCode();
if (respCode == 200)
return ConvertStream2Json(httpConn.getInputStream());
catch (MalformedURLException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
return "";
private static String ConvertStream2Json(InputStream inputStream)
String jsonStr = "";
// ByteArrayOutputStream相当于内存输出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
// 将输入流转移到内存输出流中
while ((len = inputStream.read(buffer, 0, buffer.length)) != -1)
out.write(buffer, 0, len);
// 将内存流转换为字符串
jsonStr = new String(out.toByteArray());
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
return jsonS
2、使用泛型获取javaBean(核心函数)
public static T getPerson(String jsonString, Class cls) {
t = JSON.parseObject(jsonString, cls);
} catch (Exception e) {
// TODO: handle exception
public static List getPersons(String jsonString, Class cls) {
List list = new ArrayList();
list = JSON.parseArray(jsonString, cls);
} catch (Exception e) {
public static List& listKeyMaps(String jsonString) {
List& list = new ArrayList&();
list = JSON.parseObject(jsonString,
new TypeReference&&() {
} catch (Exception e) {
// TODO: handle exception
浏览: 480853 次
可以加点注释,代码不便于阅读.
这样写的话,还要用专门的下载工具,不然,只能下到一个为空的ex ...
同上,是20
如果目录中含有中文呢?
[^\x00-\xff]
中文的范 ...
加了,还是报那个错误!FastJson内部类反序列化问题
你好,想跟你请教个问题:
以下为要JSON数据
{ "deliveryHists": [{ "delivery_status": "运单生成", "delivery_ts": " 19:25:14.0", "process_status": "01", "position_code": "SHANGHAI CHINA" }], "jp_express_section_id": "-", "sx_no": "02", "process_status": "01", "jp_express_no": "", "waybill_id": "02" }
以下为要反序列化的实体类
public class _WaybillTrackLogistics implements Serializable {
private static final long serialVersionUID = -7429469L;
private List&DeliveryHist& deliveryH
public void setDeliveryHists(List&DeliveryHist& deliveryHists){
this.deliveryHists = deliveryH
public List&DeliveryHist& getDeliveryHists(){
return deliveryH
public class DeliveryHist {
private String delivery_
public void setDelivery_status(String delivery_status){
this.delivery_status = delivery_
public String getDelivery_status(){
return delivery_
private Date delivery_
public void setDelivery_ts(Date delivery_ts){
this.delivery_ts = delivery_
public Date getDelivery_ts(){
return delivery_
private String process_
public void setProcess_status(String process_status){
this.process_status = process_
public String getProcess_status(){
return process_
private String position_
public void setPosition_code(String position_code){
this.position_code = position_
public String getPosition_code(){
return position_
private String jp_express_section_
public void setJp_express_section_id(String jp_express_section_id){
this.jp_express_section_id = jp_express_section_
public String getJp_express_section_id(){
return jp_express_section_
private String sx_
public void setSx_no(String sx_no){
this.sx_no = sx_
public String getSx_no(){
return sx_
private String process_
public void setProcess_status(String process_status){
this.process_status = process_
public String getProcess_status(){
return process_
private String jp_express_
public void setJp_express_no(String jp_express_no){
this.jp_express_no = jp_express_
public String getJp_express_no(){
return jp_express_
private String waybill_
public void setWaybill_id(String waybill_id){
this.waybill_id = waybill_
public String getWaybill_id(){
return waybill_
JSON的第一位数据为数组,这样就无法完成反序列化。不知为何。求解答。
static class DeliveryHist,这个是否可以?
--- 共有 1 条评论 ---
内部类要声明为static,要不然外部不能直接引用到(只能是创建了实例才能获取到内部类)。
--- 共有 1 条评论 ---fastjson反序列化不成功的一个问题
你好,想跟你请教个问题:
fastjson反序列化不成功的一个问题:
父类属性的set方法有返回值(返回父类本身,为了写代码时方便链式编程),反序列化到子类对象时,父类中的属性反序列化失败。案例如下:
(同事写的)类定义如下:
public class BaseResponse {
private int result = -1;
public String getCmd() {
public BaseResponse setCmd(String cmd) {
this.cmd =
public int getResult() {
public BaseResponse setResult(int result) {
this.result =
public String getNote() {
public BaseResponse setNote(String note) {
this.note =
public String toString(){
return "BaseResponse [cmd=" + cmd + ", result=" + result + ", note=" + note + "]";
public class PushMessageResp extends BaseResponse {
String str = "{\"cmd\":\"PushRescueCases\",\"result\":0,\"note\":\"Success\"}";
System.out.println(JSON.parseObject(str, PushMessageResp.class));
得到的结果是BaseResponse [cmd=null, result=-1, note=null] &明显反序列化失败。如果父类中的set方法没有返回值,则反序列化正确。如果直接反序列化到父类对象:
String str = "{\"cmd\":\"PushRescueCases\",\"result\":0,\"note\":\"Success\"}";
System.out.println(JSON.parseObject(str, BaseResponse.class));
这时候能正确反序列化BaseResponse [cmd=PushRescueCases, result=0, note=Success]。
改用gson试了下,new Gson().fromJson(str, PushRescueCasesResp.class) 可以正确反序列化到子类。JSON&之FastJson解析
一、阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:
速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json
parser。包括自称最快的JackJson;
功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省;无依赖,能够直接运行在Java SE
5.0以上版本;支持Android;开源 (Apache 2.0)
API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。
public&static&final&Object
parse(String text);&// 把JSON文本parse为JSONObject或者JSONArray&
public&static&final&JSONObject
parseObject(String text);&//
把JSON文本parse成JSONObject&&&&
public&static&final& T
parseObject(String text, Class clazz);&// 把JSON文本parse为JavaBean&
public&static&final&JSONArray
parseArray(String text);&// 把JSON文本parse成JSONArray&
public&static&final& List
parseArray(String text, Class clazz);&//把JSON文本parse成JavaBean集合&
public&static&final&String
toJSONString(Object object);&// 将JavaBean序列化为JSON文本&
public&static&final&String
toJSONString(Object object,&boolean&prettyFormat);&//
将JavaBean序列化为带格式的JSON文本&
public&static&final&Object
toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。
二、FastJson解析JSON步骤
A、服务器端将数据转换成json字符串
首先、服务器端项目要导入阿里巴巴的fastjson的jar包至builtPath路径下(这些可以到fastjson官网下载:/wiki/display/FastJSON/Home-zh)
然后将数据转为json字符串,核心函数是:
public static String createJsonString(Object value)
&&& String
alibabaJson = JSON.toJSONString(value);
&&& return
B、客户端将json字符串转换为相应的javaBean
首先客户端也要导入fastjson的两个jar包
1、客户端获取json字符串
public class HttpUtil
public static String getJsonContent(String urlStr)
{// 获取HttpURLConnection连接对象
URL url = new URL(urlStr);
HttpURLConnection httpConn = (HttpURLConnection) url
.openConnection();
// 设置连接属性
httpConn.setConnectTimeout(3000);
httpConn.setDoInput(true);
httpConn.setRequestMethod("GET");
// 获取相应码
int respCode = httpConn.getResponseCode();
if (respCode == 200)
return ConvertStream2Json(httpConn.getInputStream());
catch (MalformedURLException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
return "";
private static String ConvertStream2Json(InputStream
inputStream)
String jsonStr = "";
// ByteArrayOutputStream相当于内存输出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
// 将输入流转移到内存输出流中
while ((len = inputStream.read(buffer, 0, buffer.length)) !=
out.write(buffer, 0, len);
// 将内存流转换为字符串
jsonStr = new String(out.toByteArray());
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
return jsonS
2、使用泛型获取javaBean(核心函数)
&&& public static T getPerson(String jsonString,
Class cls) {
&&& t = JSON.parseObject(jsonString,
&&& } catch
(Exception e) {
&&& // TODO:
handle exception
&&& return
public static List getPersons(String jsonString, Class cls) {
&&& List list =
new ArrayList();
&&& list = JSON.parseArray(jsonString, cls);
&&& } catch
(Exception e) {
&&& return
public static List& listKeyMaps(String jsonString) {
List& list = new
ArrayList&();
&&& list =
JSON.parseObject(jsonString,
TypeReference&&() {
&&& } catch
(Exception e) {
&&& // TODO:
handle exception
&&& return
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 神谕幻想官网 的文章

 

随机推荐