[alibaba/fastjson]org.bson.types.ObjectId 序列化后再反序列化回来值就变了。

2025-11-03 163 views
3

使用的版本是fastjson-1.2.31 我的代码如下

import com.alibaba.fastjson.JSON;
import org.bson.types.ObjectId;

class Data {
    private ObjectId id;
    public ObjectId getId() {
        return this.id;
    }
    public void setId(ObjectId id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "{id=" + this.getId().toHexString() + "}";
    }
}
public class TestMain {
    public static void main(String[] args) {
        Data data = new Data();
        ObjectId id = new ObjectId("5a2b6e7f66a0ca1838b0f42b");
        data.setId(id);
        System.out.print("the original data: ");
        System.out.println(data);
        String fastJsonStr = JSON.toJSONString(data);
        System.out.print("fastJsonStr: ");
        System.out.println(fastJsonStr);
        Data parseData = JSON.parseObject(fastJsonStr, Data.class);
        System.out.print("parsed data :");
        System.out.println(parseData);
    }
}

输出内容如下:

the original data: {id=5a2b6e7f66a0ca1838b0f42b}
fastJsonStr: {"id":{"counter":11596843,"date":1512795775000,"machineIdentifier":6725834,"processIdentifier":6200,"time":1512795775000,"timeSecond":1512795775,"timestamp":1512795775}}
parsed data :{id=5a38df634a53ad7c8a205e3c}

这个问题怎么解决。

回答

9

没发现有问题。 以上逻辑都是对的。

9

自己写Serializer和Deserializer就好了

public class ObjectIDSerializer implements ObjectSerializer, ObjectDeserializer {
    @Override
    @SuppressWarnings("unchecked")
    public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        return (T) new ObjectId(parser.parseObject(String.class));
    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }

    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        ObjectId id = (ObjectId) object;
        serializer.write(id.toString());
    }
}

然后指定serializeUsing和deserializeUsing

class Data {
    @JSONField(serializeUsing = ObjectIDSerializer.class, deserializeUsing = ObjectIDSerializer.class)
    private ObjectId id;
    public ObjectId getId() {
        return this.id;
    }
    public void setId(ObjectId id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "{id=" + this.getId().toHexString() + "}";
    }
}

就解决问题了

9

String str = " { \"_id\" : \"5aeab29ad45ca900017cd1b5\"}"; 怎么直接调用 JSON.parseObject(String txt) 得到ObjectId对像?

7

自己写Serializer和Deserializer就好了

public class ObjectIDSerializer implements ObjectSerializer, ObjectDeserializer {
    @Override
    @SuppressWarnings("unchecked")
    public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        return (T) new ObjectId(parser.parseObject(String.class));
    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }

    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        ObjectId id = (ObjectId) object;
        serializer.write(id.toString());
    }
}

然后指定serializeUsing和deserializeUsing

class Data {
    @JSONField(serializeUsing = ObjectIDSerializer.class, deserializeUsing = ObjectIDSerializer.class)
    private ObjectId id;
    public ObjectId getId() {
        return this.id;
    }
    public void setId(ObjectId id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "{id=" + this.getId().toHexString() + "}";
    }
}

就解决问题了

自己写Serializer和Deserializer就好了

public class ObjectIDSerializer implements ObjectSerializer, ObjectDeserializer {
    @Override
    @SuppressWarnings("unchecked")
    public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        return (T) new ObjectId(parser.parseObject(String.class));
    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }

    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        ObjectId id = (ObjectId) object;
        serializer.write(id.toString());
    }
}

然后指定serializeUsing和deserializeUsing

class Data {
    @JSONField(serializeUsing = ObjectIDSerializer.class, deserializeUsing = ObjectIDSerializer.class)
    private ObjectId id;
    public ObjectId getId() {
        return this.id;
    }
    public void setId(ObjectId id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "{id=" + this.getId().toHexString() + "}";
    }
}

就解决问题了

有没有不用在每个字段上注解的,解决方法啊,