Java - 在 MongoDB 的 GridFS 中编写大对象并在 Python 中提取它

问题描述 投票:0回答:0

上下文 - 每天为外部 REST 调用生成应用程序日志文件。我正在尝试解析日志文件并提取与外部 REST 调用相关的信息。提取的信息包括 Rest Call 的 StartTime、收到响应时的 EndTime、有效负载等。这些信息是为瀑布图中的特定会话收集和整理的,以便可视化每次调用花费了多少时间。

问题 - 对于其中一个日志文件,特定会话的整理信息超过 16MB,因此我必须使用 GridFS。 REST 调用信息收集在自定义对象中。我序列化对象并上传到 GridFS。在 jupyter notebook 上,我正在提取数据,但是数据有一些额外的字符。在下面的示例中,我已将对象转换为字符串(想法是在 python 中使用 json.loads),但是当我在 python 中提取时,我得到以下 -

提取-

import javaobj.v2 as javaobj
pObj = javaobj.loads(fs.get(record['calls']).read())
pObj.dump()

转储指令的输出是-

'[String 7e0000: \'[{"tokenId":"a6fc52b3-0c60-4332-b866-09f3fe8b243f","responseTime":540.2587,"requestPayload":null,"responsePayload":"{\\\\"Identifiers\\\\":[{\\\\"Name\\\\":\\\\"XXXX MANAGEMENT LLC-CISA\\\\",\\\\"Number\\\\":\\\\"0012345\\\\",\\\\"SubNumber\\\\":\\\\"00099\\\\",\\\\"Sourceode\\\\":null,\\\\"SourceGroups\\\\":null,\\\\"IsPrimary\\\\":false}],\\\\"serviceConsumerId\\\\":\\\\"YYY\\\\",\\\\"serviceConsumerSystemId\\\\":\\\\"001\\\\",\\\\"service ....

字符串作为转义字符的斜线太多,然后以文本“String 7e0000”开头。显然 json.loads 在 python 中会失败。

下面是我用来序列化对象和存储的代码-

自定义对象转String的方法

public static String convertToString(ArrayList<LogStructure> logs){
        StringBuilder sBuilder = new StringBuilder();
        sBuilder.append("[");
        for (LogStructure log: logs){
            sBuilder.append(getString(log));
            sBuilder.append(",");
        }
        return sBuilder.toString();
    }

public static String getString(LogStructure log){
        StringBuilder sBuilder = new StringBuilder();
        sBuilder.append("{logLevel:");
        sBuilder.append(log.logLevel);
        sBuilder.append(",logInjestionDateTime:");
        sBuilder.append(log.logInjestionDateTime);
        sBuilder.append(",serverName:");
        sBuilder.append(log.serverName);

        sBuilder.append(",serviceName:");
        sBuilder.append(log.serviceName);

        sBuilder.append(",serviceEndPoint:");
        sBuilder.append(log.serviceEndPoint);

        sBuilder.append(",startTime:");
        sBuilder.append(log.startTime);

        sBuilder.append(",endTime:");
        sBuilder.append(log.endTime);

        sBuilder.append(",responseTime:");
        sBuilder.append(log.responseTime);

        sBuilder.append(",message:");
        sBuilder.append(log.message);

        sBuilder.append(",endTime:");
        sBuilder.append(log.endTime);

        sBuilder.append(",requestId:");
        sBuilder.append(log.requestId);

        sBuilder.append(",tokenId:");
        sBuilder.append(log.tokenId);

        sBuilder.append(",userId:");
        sBuilder.append(log.userId);

        sBuilder.append(",requestPayload:");
        sBuilder.append(log.requestPayload);

        sBuilder.append(",responsePayload:");
        sBuilder.append(log.responsePayload);

        sBuilder.append(",payloadType:");
        sBuilder.append(log.payloadType);
        sBuilder.append("}");

        return sBuilder.toString();
    }

在 App.java 中上传到 GridFs

JSONArray list = new JSONArray();
for(LogStructure temp: tempObject){
    totalCalls++;
    JSONObject obj = new JSONObject();
    //BasicDBObject basicDBObject = new BasicDBObject();
    obj.put("logLevel", temp.logLevel);
    obj.put("logInjestionDateTime", temp.logInjestionDateTime);
    obj.put("serverName", temp.serverName);
    obj.put("serviceName", temp.serviceName);
    obj.put("serviceEndPoint", temp.serviceEndPoint);
    obj.put("startTime", temp.startTime);
    obj.put("endTime", temp.endTime);
    obj.put("responseTime", temp.responseTime);
    obj.put("message", temp.message);
    obj.put("requestId", temp.requestId);
    obj.put("tokenId", temp.tokenId);
    obj.put("requestPayload", temp.requestPayload);
    obj.put("responsePayload", temp.responsePayload);
    obj.put("payloadType", temp.payloadType);
    list.add(obj);
}

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos;
try {
     oos = new ObjectOutputStream(baos);
     oos.writeObject(list.toJSONString());
     oos.flush();
     oos.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
InputStream is = new ByteArrayInputStream(baos.toByteArray());
// ObjectOutputStream is = new ObjectOutputStream(null);
                       

GridFSBucket gridFSBucket = mongo.getGridFsBucket(mDb, "Logs");
ObjectId objectId = mongo.uploadToGrid(is, gridFSBucket);
doc.append("totalCalls", totalCalls);
doc.append("calls", objectId);
mongo.insertDocument(mCollection, doc);

我参考了以下链接来了解 GridFs 和对象的序列化。

https://mongodb.github.io/mongo-java-driver/3.5/driver/tutorials/gridfs/ https://howtodoinjava.com/java/serialization/custom-serialization-readobject-writeobject/ https://www.baeldung.com/java-serialization

目前Java在Mongo中存储和提取的方式,有一些与Java相关的特定文本。例如,第一次尝试是按原样序列化 ArrayList 对象,但是当我在 python 中提取数据时,字符串具有“System.*.ArrayList”。然后我尝试使用 simple.json 库将数据存储为 JsonObject。默认序列化具有对象的内存地址。然后我使用 toJsonString 方法并尝试保存为字符串,期望最终字符串为 pattern

"{"key": [{"key1":value},{"key2":value}]}"

这将允许我使用 json.loads 函数并获取字典。

python java json mongodb gridfs
© www.soinside.com 2019 - 2024. All rights reserved.