🙆

json 見やすくする

2023/12/12に公開

test.txt

{
  "person": {
    "name": "John Doe",
    "age": 30,
    "address": {
      "city": "Example City",
      "state": "Test State",
      "zipcode": "12345"
    },
    "contacts": [
      {
        "type": "email",
        "value": "john.doe@example.com"
      },
      {
        "type": "phone",
        "value": "555-1234"
      }
    ]
  }
}

python code

import tkinter as tk
from tkinter import ttk
import json

def load_text(filename):
    with open(filename, 'r', encoding='utf-8') as file:
        data = file.read()
    return data

def main():
    # テキストファイルのパスを指定
    text_file_path = "test.txt"

    # テキストデータを読み込む
    text_data = load_text(text_file_path)

    try:
        # JSON形式の文字列をPythonオブジェクトに変換
        json_data = json.loads(text_data)
    except json.JSONDecodeError as e:
        print(f"JSONデコードエラー: {e}")
        return

    # GUIの設定
    root = tk.Tk()
    root.title("Text Viewer")

    # ウィンドウサイズを設定
    root.geometry("800x600")

    # フォントの設定
    custom_font = ("Helvetica", 12)

    # ttk.Styleを使用してフォントを設定
    style = ttk.Style()
    style.configure("Treeview", font=custom_font)

    # Treeviewを使用してJSONデータを表示
    tree = ttk.Treeview(root)
    tree.heading("#0", text="JSON Data", anchor='w')
    tree.pack(expand=tk.YES, fill=tk.BOTH)

    # 再帰的にJSONデータをTreeviewに表示する関数
    def display_json_tree(json_data, parent_node=''):
        for key, value in json_data.items():
            if isinstance(value, dict):
                node_id = tree.insert(parent_node, "end", text=key, open=True)
                display_json_tree(value, parent_node=node_id)
            else:
                tree.insert(parent_node, "end", text=f"{key}: {value}")

    display_json_tree(json_data)

    root.mainloop()

if __name__ == "__main__":
    main()
import tkinter as tk
from tkinter import ttk
import json

def load_text(filename):
    with open(filename, 'r', encoding='utf-8') as file:
        data = file.read()
    return data

def main():
    # テキストファイルのパスを指定
    text_file_path = "test.txt"

    # テキストデータを読み込む
    text_data = load_text(text_file_path)

    try:
        # JSON形式の文字列をPythonオブジェクトに変換
        json_data = json.loads(text_data)
    except json.JSONDecodeError as e:
        print(f"JSONデコードエラー: {e}")
        return

    # GUIの設定
    root = tk.Tk()
    root.title("Text Viewer")

    # ウィンドウサイズを設定
    root.geometry("800x600")

    # フォントの設定
    custom_font = ("Helvetica", 12)

    # ttk.Styleを使用してフォントを設定
    style = ttk.Style()
    style.configure("Treeview", font=custom_font)

    # Treeviewを使用してJSONデータを表示
    tree = ttk.Treeview(root)
    tree.heading("#0", text="JSON Data", anchor='w')
    tree.pack(expand=tk.YES, fill=tk.BOTH)

    # JSONデータを展開して表示する関数
    def display_json_tree(json_data, parent_node=''):
        for key, value in json_data.items():
            if isinstance(value, dict):
                node_id = tree.insert(parent_node, "end", text=key, open=True)
                display_json_tree(value, parent_node=node_id)
            elif isinstance(value, list):
                node_id = tree.insert(parent_node, "end", text=f"{key} (list)", open=True)
                for i, item in enumerate(value):
                    item_id = tree.insert(node_id, "end", text=f"[{i}]", open=False)
                    display_json_tree(item, parent_node=item_id)
            else:
                tree.insert(parent_node, "end", text=f"{key}: {value}")

    display_json_tree(json_data)

    root.mainloop()

if __name__ == "__main__":
    main()

表形式

import tkinter as tk
from tkinter import ttk
import json

def load_text(filename):
    with open(filename, 'r', encoding='utf-8') as file:
        data = file.read()
    return data

def flatten_json(json_data, parent_key='', separator='.'):
    flattened = {}
    for key, value in json_data.items():
        new_key = f"{parent_key}{separator}{key}" if parent_key else key
        if isinstance(value, dict):
            flattened.update(flatten_json(value, new_key, separator=separator))
        elif isinstance(value, list):
            for i, item in enumerate(value):
                item_key = f"{new_key}[{i}]"
                if isinstance(item, dict):
                    flattened.update(flatten_json(item, item_key, separator=separator))
                else:
                    flattened[item_key] = item
        else:
            flattened[new_key] = value
    return flattened

def copy_all_to_clipboard(event):
    selected = tree.selection()
    if selected:
        key = tree.item(selected, 'text')
        values = tree.item(selected, 'values')
        if key and values:
            root.clipboard_clear()
            root.clipboard_append(f"{key}: {values[0]}")
            root.update()

def copy_key_to_clipboard(event):
    selected = tree.selection()
    if selected:
        key = tree.item(selected, 'text')
        if key:
            root.clipboard_clear()
            root.clipboard_append(key)
            root.update()

def copy_value_to_clipboard(event):
    selected = tree.selection()
    if selected:
        values = tree.item(selected, 'values')
        if values:
            root.clipboard_clear()
            root.clipboard_append(values[0])
            root.update()

def paste_from_clipboard(event):
    data = root.clipboard_get()
    if data:
        tree.insert('', 'end', text="Pasted", values=(data,))

def main():
    # テキストファイルのパスを指定
    text_file_path = "test.txt"

    # テキストデータを読み込む
    text_data = load_text(text_file_path)

    try:
        # JSON形式の文字列をPythonオブジェクトに変換
        json_data = json.loads(text_data)
    except json.JSONDecodeError as e:
        print(f"JSONデコードエラー: {e}")
        return

    # フラットなデータに変換
    flattened_data = flatten_json(json_data)

    # GUIの設定
    global root
    root = tk.Tk()
    root.title("JSON Viewer")

    # Treeviewを使用して表形式でJSONデータを表示
    global tree
    tree = ttk.Treeview(root)
    tree['columns'] = ('Value',)
    tree.heading("#0", text="Key", anchor='w')
    tree.heading('Value', text='Value', anchor='w')
    tree.column('#0', stretch=tk.YES)
    tree.column('Value', stretch=tk.YES)

    for key, value in flattened_data.items():
        tree.insert('', 'end', text=key, values=(str(value),))

    tree.pack(expand=tk.YES, fill=tk.BOTH)

    # キーと値をコピーペーストできるようにする
    tree.bind("<Control-a>", copy_all_to_clipboard)
    tree.bind("<Control-k>", copy_key_to_clipboard)
    tree.bind("<Control-c>", copy_value_to_clipboard)
    tree.bind("<Control-v>", paste_from_clipboard)

    root.mainloop()

if __name__ == "__main__":
    main()

たためる

import tkinter as tk
from tkinter import ttk
import json

def load_text(filename):
    with open(filename, 'r', encoding='utf-8') as file:
        data = file.read()
    return data

def main():
    # テキストファイルのパスを指定
    text_file_path = "test.txt"

    # テキストデータを読み込む
    text_data = load_text(text_file_path)

    try:
        # JSON形式の文字列をPythonオブジェクトに変換
        json_data = json.loads(text_data)
    except json.JSONDecodeError as e:
        print(f"JSONデコードエラー: {e}")
        return

    # GUIの設定
    root = tk.Tk()
    root.title("Text Viewer")

    # ウィンドウサイズを設定
    root.geometry("800x600")

    # フォントの設定
    custom_font = ("Helvetica", 12)

    # ttk.Styleを使用してフォントを設定
    style = ttk.Style()
    style.configure("Treeview", font=custom_font)

    # Treeviewを使用してJSONデータを表示
    tree = ttk.Treeview(root)
    tree.heading("#0", text="JSON Data", anchor='w')
    tree.pack(expand=tk.YES, fill=tk.BOTH)

    # JSONデータを展開して表示する関数
    def display_json_tree(json_data, parent_node=''):
        for key, value in json_data.items():
            if isinstance(value, dict):
                node_id = tree.insert(parent_node, "end", text=key, open=True)
                display_json_tree(value, parent_node=node_id)
            elif isinstance(value, list):
                node_id = tree.insert(parent_node, "end", text=f"{key} (list)", open=True)
                for i, item in enumerate(value):
                    item_id = tree.insert(node_id, "end", text=f"[{i}]", open=False)
                    display_json_tree(item, parent_node=item_id)
            else:
                tree.insert(parent_node, "end", text=f"{key}: {value}")

    display_json_tree(json_data)

    root.mainloop()

if __name__ == "__main__":
    main()

Discussion