2014-01-15 3 views
0

, которые утилита командной строки может довольно-распечатать файл с несколькими линиями (каждый закодированный в формате JSON)JSON довольно напечатать несколько строк

входного файла: msgs.json:

[1,{"6":7,"4":5}] 
[2,{"6":7,"4":5}] 

кажется, что JSON. инструмент работает только с одним сообщением JSON

EDIT: модифицированный json.tool для поддержки нескольких сбщ JSON в ответе below

Пример использования:

python myjson.py msgs.json 
        [ 
         1, 
         { 
          "4": 5, 
          "6": 7 
         } 
        ] 
        [ 
         2, 
         { 
          "4": 5, 
          "6": 7 
         } 
        ] 
+1

пожалуйста, дайте пример для ваших «нескольких линий json». – Mehdi

+2

Вероятно, это просто недействительный JSON. Помните, что JSON, например XML, может иметь только одно значение * root *. Таким образом, текстовые данные '{" a ": 1} {" b ": 2}' являются недопустимыми JSON, а объектом, содержащим 'b', является« Дополнительные данные ». – user2864740

+2

В частности, это, вероятно, _is_ в стандартном формате (квази), либо multi-JSON (несколько объектов JSON, следующих друг за другом напрямую, например, проводной протокол JSON-RPC), или JSON-линии (несколько объектов JSON, все без каких-либо unescaped newlines, разделенные символами новой строки). Python не имеет встроенного анализатора для любого из этих двух форматов, но невероятно просто написать свой собственный. – abarnert

ответ

0

myjson.py - модифицированный инструмент JSON для поддержки нескольких сообщений в формате JSON:

#!/usr/bin/python 

"""myjson.py: Command-line tool to validate and pretty-print JSON 

Usage:: 
    1)  $ echo '{"json":"obj"}' | python myjson.py 
     { 
      "json": "obj" 
     } 
    2)  $ echo '{ 1.2:3.4}' | python myjson.py 
     Expecting property name enclosed in double quotes: line 1 column 2 (char 2) 

    3) printing a file with multiple lines where each line is a JSON message: 
      e.g. msgs.json: 
        [1,,{"6":7,"4":5}] 
        [2,{"6":7,"4":5}] 
      python myjson.py msgs.json 
        [ 
         1, 
         { 
          "4": 5, 
          "6": 7 
         } 
        ] 
        [ 
         2, 
         { 
          "4": 5, 
          "6": 7 
         } 
        ] 
""" 
import sys 
import json 
def main(): 
     data = [] 
     if len(sys.argv) == 1: 
      infile = sys.stdin 
      outfile = sys.stdout 
     elif len(sys.argv) == 2: 
      infile = open(sys.argv[1], 'rb') 
      outfile = sys.stdout 
     elif len(sys.argv) == 3: 
      infile = open(sys.argv[1], 'rb') 
      outfile = open(sys.argv[2], 'wb') 
     else: 
      raise SystemExit(sys.argv[0] + " [infile [outfile]]") 
     with infile: 
      try: 
        for line in infile: 
          data.append(json.loads(line)) 
      except ValueError, e: 
       raise SystemExit(e) 
     with outfile: 
      for d in data: 
        json.dump(d, outfile, sort_keys=True, 
          indent=4, separators=(',', ': ')) 
        outfile.write('\n') 
if __name__ == '__main__': 
     main() 
1

jq может сделать это и многое другое, это то, что я использую, но может быть избыточна для вас. Вы можете найти его here.

cat yourfile.json | jq '.' должен сделать трюк

+0

выдает ошибки на специальных символах (например, кавычки), которые являются частью json msg – alex

+0

. Вы уверены, что кавычки экранированы правильно, а не smartquotes? – anq

+0

цитаты на входе не экранированы, ожидается, что инструмент json позаботится об этом – alex

3

В Python сделать что-то вроде этого:

import json 

with open('msgs.json', 'r') as json_file: 
    for row in json_file: 
     data = json.loads(row) 
     print json.dumps(data, sort_keys=True, indent=2, separators=(',', ': ')) 
Смежные вопросы