288 | 288 | """ |
289 | 289 | |
290 | 290 | def extractFromFile(self, filepath): |
291 | 291 | with codecs.open(filepath, "r", encoding='utf-8-sig') as fileObject: |
292 | 292 | lineCount = 0 |
293 | 293 | for line in [line.strip("\n\r") for line in fileObject.readlines()]: |
294 | 294 | lineCount += 1 |
295 | 295 | if line: |
296 | 296 | yield line, None, None, None, lineCount, [] |
297 | 297 | |
298 | 298 | |
299 | 299 | |
300 | 300 | class json(Extractor): |
301 | 301 | """ Extract messages from JSON files. |
302 | 302 | """ |
303 | 303 | |
304 | 304 | def __init__(self, directoryPath=None, filemasks=[], options={}): |
305 | 305 | super(json, self).__init__(directoryPath, filemasks, options) |
306 | 306 | self.breadcrumbs = [] |
307 | 307 | self.keywords = self.options.get("keywords", {}) |
312 | 314 | |
313 | 315 | @staticmethod |
314 | 316 | def formatBreadcrumbs(breadcrumbs): |
315 | 317 | firstPiece = breadcrumbs[0] |
316 | 318 | if isinstance(firstPiece, int): outputString = "[" + str(firstPiece) + "]" |
317 | 319 | else: outputString = firstPiece |
318 | 320 | for piece in breadcrumbs[1:]: |
319 | 321 | if isinstance(piece, int): outputString += "[" + str(piece) + "]" |
320 | 322 | else: outputString += "." + piece |
321 | 323 | return outputString |
322 | 324 | |
323 | 325 | def extractFromFile(self, filepath): |
324 | 326 | with codecs.open(filepath, "r", 'utf-8') as fileObject: |
325 | 327 | for message, breadcrumbs in self.extractFromString(fileObject.read()): |
327 | 329 | |
328 | 330 | def extractFromString(self, string): |
329 | 331 | self.breadcrumbs = [] |
330 | 332 | jsonDocument = jsonParser.loads(string) |
331 | 333 | if isinstance(jsonDocument, list): |
332 | 334 | for message, breadcrumbs in self.parseList(jsonDocument): |
333 | 335 | if message: # Skip empty strings. |
334 | 336 | yield message, breadcrumbs |
335 | 337 | elif isinstance(jsonDocument, dict): |
336 | 338 | for message, breadcrumbs in self.parseDictionary(jsonDocument): |
337 | 339 | if message: # Skip empty strings. |
338 | 340 | yield message, breadcrumbs |
339 | 341 | else: |
340 | 342 | raise Exception("Unexpected JSON document parent structure (not a list or a dictionary). You must extend the JSON extractor to support it.") |
341 | 343 | |
342 | 344 | def parseList(self, itemsList): |
343 | 345 | index = 0 |
344 | 346 | for listItem in itemsList: |
345 | 347 | self.breadcrumbs.append(index) |
346 | 348 | if isinstance(listItem, list): |