[alibaba/fastjson]在Android中使用fastjson将List转换成String字符串的过程中,出现中文乱码

2025-11-12 15 views
6

调用的此API转换的List String classObserveContent = JSONArray.toJSONString(list); 转换后的classObserveContent有中文乱码的情况。 list集合中的KnowledgeQuestionModel对象(内部嵌套了有新的list集合) `public class KnowledgeQuestionModel implements Serializable{

private String top_class;

private List<ChildBean> child;

public String getTop_class() {
    return top_class;
}

public void setTop_class(String top_class) {
    this.top_class = top_class;
}

public List<ChildBean> getChild() {
    return child;
}

public void setChild(List<ChildBean> child) {
    this.child = child;
}

public class ChildBean implements Serializable{
    private String name;
    private String img;

    private List<QuestionModel> question;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImg() {
        return img;
    }

    public void setImg(String img) {
        this.img = img;
    }

    public List<QuestionModel> getQuestion() {
        return question;
    }

    public void setQuestion(List<QuestionModel> question) {
        this.question = question;
    }

}

} 在QuestionModel中也有HaspMap,QuestionModel如下(省略了get和set方法): private String type; private String child; private String stem; private String id; private String classify; private String role; private HashMap<String, Boolean> extendOptionMap; private String shortAnswerStr;

public String getShortAnswerStr() { return shortAnswerStr; }

public void setShortAnswerStr(String shortAnswerStr) { this.shortAnswerStr = shortAnswerStr; }

public HashMap<String, Boolean> getExtendOptionMap() { return extendOptionMap; }

public void setExtendOptionMap(HashMap<String, Boolean> extendOptionMap) { this.extendOptionMap = extendOptionMap; }

private List option; ` 希望大神指点一番

回答

7

你是怎样用fastjson的?

1

序列化 String classObserveContent = JSONArray.toJSONString(list); 反序列化使用的是 List list = (List) JSONArray.parseArray(classObserveStr,KnowledgeQuestionModel.class);

6

classObserveStr是不是输入的时候就乱码了?

7

是的,在序列化的那一步就出现了乱码

0

@wenshao 在把集合转换成string的时候中文没有乱码,但是出现了一些原始数据里面没有的东西,新增内容为 "this$0": { "$ref": "$[3]" } (中括号里面的数字有的是0、1或2。) 之后我把string字符串存在一个文件里面,再从文件里面读取这串字符串的时候,就会出现中文乱码,而且 类似于 "this$0": { "$ref": "$[3]" } 这样的数据还是存在

7
JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);

这样试试看

6

刚才按照您的方法试了下,发现内存溢出了 Process: com.xxx.xxx, PID: 20993 java.lang.StackOverflowError: stack size 8MB at com.alibaba.fastjson.serializer.SerializeConfig.getObjectWriter(SerializeConfig.java:409) at com.alibaba.fastjson.serializer.SerializeConfig.getObjectWriter(SerializeConfig.java:405) at com.alibaba.fastjson.serializer.JSONSerializer.getObjectWriter(JSONSerializer.java:359) at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:130) at com.alibaba.fastjson.serializer.FieldSerializer.writeValue(FieldSerializer.java:278) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:358) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:112) at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:137) (部分log日志)

2

有循环引用?

6

@wenshao 温少您好,昨天的问题在list转换string过程中出现的"this$0": {"$ref": "$[3]"},按照您上面说的方法,解决了,乱码的问题是我在数据存取的过程中出现的,在存取过程中,指定编码格式,乱码问题就解决,内存溢出的情况出现了二三次就没有再复现。

但是... 新的乱码问题出现了: 还是把list转换成string,只是这次list里面放置的数据不同 private List<List<HashMap<String, Object>>> logs(待转换数据) 使用的方法是按照上面的两个参数的方法(一个参数的也有试) String arrayString = JSON.toJSONString(logs, SerializerFeature.DisableCircularReferenceDetect); 这次转换后的数据,我直接的打印的,没有做任何的处理,会有部分的中文乱码。 中间也尝试了将转换后的string重新编码,但是效果依旧。

经过多次尝试,乱码有以下特点: 1、只有在待转数据中有中文字符的时候,会出现乱码 2、待转数据量比较多的时候,一定会出现个别的中文乱码(具体的数量我也说不准,大概的就是当集合中的数据大于200+条左右就会出现) 3、乱码的中文字符不固定,比较随机

以下是从转换好的数据中找到的乱码个例 {"from":"学���准备","x":"31103","xx":"1510799265216","xxx":"48848","xxxx":""} {"from":"���生���备","x":"31102","xx":"1510799265216","xxx":"5075","xxxx":["2X1","2X2","2X3","2X4"]} {"from":"课堂�������������入","x":"21102","xx":"1510799210682","xxx":"44959","xxxx":["2X1","2X4","2X6","2X7"]}

8

@wenshao 温少能否给以上描述的问题给点指点,水平有限,看源码也是一知半解,虽然现在已经用数字替代了中文字符不会有什么问题,但以后难免还是会出现有中文字符的情况,希望您能抽空看一下,给个解决思路,感谢.

3

这个乱码不是fastjson导致的,应该本来就有乱码

0

遇到了同样的问题,有结果么?同样的数据,每次乱码的位置不一样。

8

遇到了同样的问题,有结果么?同样的数据,每次乱码的位置不一样。

jvm启动 加上 -Dfile.encoding=UTF-8 试试