如何在Kotlin的JSONObject中添加Date对象以推送至MongoDB?
如何在Kotlin的JSONObject中添加Date对象以推送至MongoDB?
这个问题我之前也踩过坑!你用的org.json.JSONObject本身是遵循标准JSON规范的,而JSON原生并没有Date类型,所以它会把任何非JSON原生类型的对象(比如Instant)直接调用toString()转成字符串,这就是为什么你的日期最终变成了ISO格式的字符串,MongoDB收到后自然就存成字符串类型了。
下面给你两个靠谱的解决思路,优先推荐第一种:
推荐方案:直接用MongoDB官方驱动的
Document类
这是最适配MongoDB的方式,因为org.bson.Document是MongoDB驱动专门提供的类,天生支持BSON数据类型(包括专门的Date类型),完全不用纠结字符串转日期的问题。直接替换掉原来的JSONObject就行:import org.bson.Document import java.time.Instant fun main() { val mongoDoc = Document() mongoDoc.put("first", "a") mongoDoc.put("second", "b") // 直接传入Instant或者java.util.Date都可以,驱动会自动处理成BSON Date mongoDoc.put("date", Instant.now()) // 之后直接把这个mongoDoc传给MongoDB的insert/update方法就好 }这样MongoDB收到后会把
date字段存成真正的Date对象,后续你想用MongoDB的日期聚合、格式化等操作都完全没问题。如果你的驱动版本稍旧,可能需要把Instant转成java.util.Date(用Date.from(Instant.now())),新的驱动版本已经直接支持java.time系列类型了。如果必须保留
org.json.JSONObject的替代方案
要是因为项目限制必须用org.json.JSONObject,那可以在转成MongoDB可识别的格式时手动修正日期字段:import org.json.JSONObject import org.bson.Document import java.time.Instant fun main() { val json = JSONObject() json.put("first", "a") json.put("second", "b") json.put("date", Instant.now().toString()) // 先把JSON转成Document,再手动把字符串日期转成Instant val doc = Document.parse(json.toString()) doc.put("date", Instant.parse(doc.getString("date"))) // 最后把处理后的doc传给MongoDB }不过这个方法有点画蛇添足,不如直接用
Document来得省心,所以还是优先推荐第一种方案。
内容来源于stack exchange
相关产品推荐
相关产品推荐

