首页 > 编程知识 正文

包含cod的自定义json编码器的词条

时间:2023-12-03 20:09:14 阅读:311926 作者:ZBVB

本文目录一览:

  • 1、Cod战区多少tick
  • 2、【json.tool】关于python -m json.tool中文乱码问题的处理
  • 3、如何让Jackson JSON生成的数据包含的中文以unicode方式编码
  • 4、cod16自定义房间有经验吗

Cod战区多少tick

12tick。Cod战区tick是自定义的,一般为12tick,而很多人因为使用速度太慢设置为是60tick使得游戏体验感更好,服务器的速度更快。

【json.tool】关于python -m json.tool中文乱码问题的处理

python一行式解析json怎么避免中文转化为unicode编码?

在以 json 为数据传输格式的 RESTful 接口非常流行。为调试这样的接口,一个常用的办法是使用 curl 命令:

curl   

对于返回的 json 字符串,一般在服务端不加处理的情况下,都是没有任何 't' 和 'n' 的。

为了方便查看,在 bash 上可以简单地对它进行格式化:

curl | python -m  json.tool

当然这要求机器上安装了 python,其实也就是利用了 json.tool 这个程序。

然而有时候还有一个问题,就是若返回的 json 字符串中包含中文,那么这样打印出来之后,中文会变成以 u 开头的转义形式,从而让程序员无法直接观察到中文的内容,这并非是一个 bug,而是 json 本身的标准,它要求 json 的内容都是 ascii 编码的,标准的 json 编码器和解码器都会遵循这一点。

# vim /usr/lib64/python2.7/json/tool.py

# curl -s -X POST -H 'cache-control: no-cache' | python -m json.tool

python -m json.tool中文乱码问题

python -m json.tool 中文乱码 Format JSON with python

python -m json.tool to output Chinese

python -m json.tool to output Chinese

Saving utf-8 texts with json.dumps as UTF8, not as u escape sequence

如何让Jackson JSON生成的数据包含的中文以unicode方式编码

Jackson JSON其实在默认设置下已经具备了对Unicode编码的JSON数据进行解析。所欠缺的就是在序列化对象时缺少相应的步骤。好在Jackson JSON框架允许我们自定义序列化方法。那么我们就来写一个序列化类:

复制代码代码如下:

import java.io.IOException;

import org.codehaus.jackson.JsonGenerationException;

import org.codehaus.jackson.JsonGenerator;

import org.codehaus.jackson.JsonProcessingException;

import org.codehaus.jackson.impl.JsonWriteContext;

import org.codehaus.jackson.map.JsonSerializer;

import org.codehaus.jackson.map.SerializerProvider;

import org.codehaus.jackson.util.CharTypes;

public class StringUnicodeSerializer extends JsonSerializerString {

private final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();

private final int[] ESCAPE_CODES = CharTypes.get7BitOutputEscapes();

private void writeUnicodeEscape(JsonGenerator gen, char c) throws IOException {

gen.writeRaw('\');

gen.writeRaw('u');

gen.writeRaw(HEX_CHARS[(c 12) 0xF]);

gen.writeRaw(HEX_CHARS[(c 8) 0xF]);

gen.writeRaw(HEX_CHARS[(c 4) 0xF]);

gen.writeRaw(HEX_CHARS[c 0xF]);

}

private void writeShortEscape(JsonGenerator gen, char c) throws IOException {

gen.writeRaw('\');

gen.writeRaw(c);

}

@Override

public void serialize(String str, JsonGenerator gen,

SerializerProvider provider) throws IOException,

JsonProcessingException {

int status = ((JsonWriteContext) gen.getOutputContext()).writeValue();

switch (status) {

case JsonWriteContext.STATUS_OK_AFTER_COLON:

gen.writeRaw(':');

break;

case JsonWriteContext.STATUS_OK_AFTER_COMMA:

gen.writeRaw(',');

break;

case JsonWriteContext.STATUS_EXPECT_NAME:

throw new JsonGenerationException("Can not write string value here");

}

gen.writeRaw('"');//写入JSON中字符串的开头引号

for (char c : str.toCharArray()) {

if (c = 0x80){

writeUnicodeEscape(gen, c); // 为所有非ASCII字符生成转义的unicode字符

}else {

// 为ASCII字符中前128个字符使用转义的unicode字符

int code = (c ESCAPE_CODES.length ? ESCAPE_CODES[c] : 0);

if (code == 0){

gen.writeRaw(c); // 此处不用转义

}else if (code 0){

writeUnicodeEscape(gen, (char) (-code - 1)); // 通用转义字符

}else {

writeShortEscape(gen, (char) code); // 短转义字符 (n t ...)

}

}

}

gen.writeRaw('"');//写入JSON中字符串的结束引号

}

}

这个序列化类将要对应用中所有使用Jackson JSON的地方全都用一种方法来处理字符串类型。光有了方法还不行,还要对它进行注册。让Jackson JSON在序列化对象的时候使用刚刚定义好的方法:

复制代码代码如下:

if (objectMapper== null){

objectMapper= new ObjectMapper();

//当找不到对应的序列化器时 忽略此字段

objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

//使Jackson JSON支持Unicode编码非ASCII字符

CustomSerializerFactory serializerFactory= new CustomSerializerFactory();

serializerFactory.addSpecificMapping(String.class, new StringUnicodeSerializer());

objectMapper.setSerializerFactory(serializerFactory);

//支持结束

}

接下来我们来做一个测试用的对象,验证我们的代码:

复制代码代码如下:

import java.util.Date;

import net.csdn.blog.chaijunkun.util.DateDeserializer;

import net.csdn.blog.chaijunkun.util.DateSerializer;

import net.csdn.blog.chaijunkun.util.DateTimeDeserializer;

import net.csdn.blog.chaijunkun.util.DateTimeSerializer;

import org.codehaus.jackson.annotate.JsonPropertyOrder;

import org.codehaus.jackson.map.annotate.JsonDeserialize;

import org.codehaus.jackson.map.annotate.JsonSerialize;

@JsonPropertyOrder(alphabetic= false)

public class DemoObj {

private Integer sid;

private String stuName;

private Boolean sex;

@JsonSerialize(using= DateSerializer.class)

@JsonDeserialize(using= DateDeserializer.class)

private Date birthday;

@JsonSerialize(using= DateTimeSerializer.class)

@JsonDeserialize(using= DateTimeDeserializer.class)

private Date logTime;

//Getters and Setters

}

从代码上可以看出,我们并没有对String类型的属性强制指定用何种序列与反序列方法。然后我们来构造测试用例:

复制代码代码如下:

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import net.csdn.blog.chaijunkun.json.DemoObj;

import net.csdn.blog.chaijunkun.util.JSONUtil;

import org.apache.log4j.Logger;

public class JSONTest {

private static Logger logger= Logger.getLogger(JSONTest.class);

private static String json= "{"sid":2,"stuName":"u6C5Fu5357Style","sex":true,"birthday":"2012-07-15","logTime":"2012-12-04 19:22:36"}";

public static void main(String[] args) {

DemoObj objSrc= new DemoObj();

objSrc.setSid(1);

objSrc.setStuName("鸟叔");

objSrc.setSex(true);

Calendar calendar= Calendar.getInstance();

calendar.set(1977, Calendar.DECEMBER, 31, 0, 0, 0);

objSrc.setBirthday(calendar.getTime());

objSrc.setLogTime(new Date());

logger.info(String.format("转换为JSON后的数据:%s", JSONUtil.toJSON(objSrc)));

DemoObj objDes= JSONUtil.fromJSON(json, DemoObj.class);

if(objDes==null){

logger.info("反序列化失败");

}else{

logger.info("反序列化成功");

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

logger.info(String.format("标识:%d", objDes.getSid()));

logger.info(String.format("姓名:%s", objDes.getStuName()));

logger.info(String.format("性别:%s", objDes.getSex()==true?"男":"女"));

logger.info(String.format("生日:%s", sdf.format(objDes.getBirthday())));

logger.info(String.format("登录日期:%s", sdf.format(objDes.getLogTime())));

}

}

}

看一下输出:

复制代码代码如下:

转换为JSON后的数据:{"sid":1,"stuName":"u9E1Fu53D4","sex":true,"birthday":"1977-12-31","logTime":"2012-12-04 19:31:57"}

反序列化成功

标识:2

姓名:江南Style

性别:男

生日:2012-07-15 00:00:00

登录日期:2012-12-04 19:22:36

我们看到,已经成功将中文字符显示成为了Unicode编码的数据。同样,我们之前构造的Unicode编码的数据,在不经过任何修改的情况下成功显示出来了。

细心的朋友也许观察到了,在测试用的对象定义代码中,针对同样Date类型的属性“birthday”和“logTime”,我们指定了不同的序列化与反序列化方法。让我们来看烂这两个有什么不同:

复制代码代码如下:

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import org.codehaus.jackson.JsonGenerator;

import org.codehaus.jackson.JsonProcessingException;

import org.codehaus.jackson.map.JsonSerializer;

import org.codehaus.jackson.map.SerializerProvider;

public class DateTimeSerializer extends JsonSerializerDate {

@Override

public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)

throws IOException, JsonProcessingException {

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String formattedDate= sdf.format(date);

gen.writeString(formattedDate);

}

}

复制代码代码如下:

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import org.codehaus.jackson.JsonParser;

import org.codehaus.jackson.JsonProcessingException;

import org.codehaus.jackson.map.DeserializationContext;

import org.codehaus.jackson.map.JsonDeserializer;

public class DateTimeDeserializer extends JsonDeserializerDate {

@Override

public Date deserialize(JsonParser parser, DeserializationContext context)

throws IOException, JsonProcessingException {

String dateFormat= "yyyy-MM-dd HH:mm:ss";

SimpleDateFormat sdf= new SimpleDateFormat(dateFormat);

try{

String fieldData= parser.getText();

return sdf.parse(fieldData);

}catch (Exception e) {

Calendar ca= Calendar.getInstance();

ca.set(1970, Calendar.JANUARY, 1, 0, 0, 0);

return ca.getTime();

}

}

}

复制代码代码如下:

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import org.codehaus.jackson.JsonGenerator;

import org.codehaus.jackson.JsonProcessingException;

import org.codehaus.jackson.map.JsonSerializer;

import org.codehaus.jackson.map.SerializerProvider;

public class DateSerializer extends JsonSerializerDate {

@Override

public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)

throws IOException, JsonProcessingException {

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");

String formattedDate= sdf.format(date);

gen.writeString(formattedDate);

}

}

复制代码代码如下:

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import org.codehaus.jackson.JsonParser;

import org.codehaus.jackson.JsonProcessingException;

import org.codehaus.jackson.map.DeserializationContext;

import org.codehaus.jackson.map.JsonDeserializer;

public class DateDeserializer extends JsonDeserializerDate {

@Override

public Date deserialize(JsonParser parser, DeserializationContext context)

throws IOException, JsonProcessingException {

String dateFormat= "yyyy-MM-dd";

SimpleDateFormat sdf= new SimpleDateFormat(dateFormat);

try{

String fieldData= parser.getText();

return sdf.parse(fieldData);

}catch (Exception e) {

Calendar ca= Calendar.getInstance();

ca.set(1970, Calendar.JANUARY, 1, 0, 0, 0);

return ca.getTime();

}

}

}

cod16自定义房间有经验吗

有。cod16自定义里也是可以加经验条的。所以可以通过cod16自定义游戏,通过改变规则实现快速刷经验条。经验条只是让宠物进化加速,只是加速而不是满条就可以进化。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。