本文目錄一覽:
- 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\”:\”\u6C5F\u5357Style\”,\”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”:”\u9E1F\u53D4″,”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自定義遊戲,通過改變規則實現快速刷經驗條。經驗條只是讓寵物進化加速,只是加速而不是滿條就可以進化。
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/130233.html