(defun sanitize-json-string (str / i char res)
  (setq res "")
  (setq i 1)
  (while (<= i (strlen str))
    (setq char (substr str i 1))
    ;; JSONのパースエラーを防ぐため特殊記号をスペースに置換
    (if (or (= char "\\") (= char "\"") (= char "\n") (= char "\r"))
      (setq res (strcat res " "))
      (setq res (strcat res char))
    )
    (setq i (1+ i))
  )
  res
)

(defun c:EJSON ( / sel fn file i ent ed etype ptList txt h pt old_dimzin )
  (vl-load-com)
  (princ "\n--- JSON座標抽出コマンド ---")
  (princ "\n出力する線分、ポリライン、文字を選択してください: ")
  
  ;; TEXT と MTEXT を抽出対象に追加
  (setq sel (ssget '((0 . "LINE,LWPOLYLINE,TEXT,MTEXT"))))
  (if (not sel) (exit))

  (setq old_dimzin (getvar "DIMZIN"))
  (setvar "DIMZIN" 0)

  (setq fn (getfiled "JSONファイルを保存" "C:\\" "json" 1))
  (if (not fn) (progn (setvar "DIMZIN" old_dimzin) (exit)))

  (setq file (open fn "w"))
  (write-line "[" file)
  (setq i 0)

  (while (< i (sslength sel))
    (setq ent (ssname sel i))
    (setq ed (entget ent))
    (setq etype (cdr (assoc 0 ed)))
    (setq ptList "")

    (if (= etype "LINE")
      (setq ptList (strcat "[{\"x\":" (rtos (cadr (assoc 10 ed)) 2 8) ",\"y\":" (rtos (caddr (assoc 10 ed)) 2 8) "},"
                           "{\"x\":" (rtos (cadr (assoc 11 ed)) 2 8) ",\"y\":" (rtos (caddr (assoc 11 ed)) 2 8) "}]"))
    )

    (if (= etype "LWPOLYLINE")
      (progn
        (setq ptList "[")
        (foreach item ed
          (if (= (car item) 10)
            (setq ptList (strcat ptList "{\"x\":" (rtos (cadr item) 2 8) ",\"y\":" (rtos (caddr item) 2 8) "},"))
          )
        )
        (if (> (strlen ptList) 1)
          (setq ptList (substr ptList 1 (1- (strlen ptList))))
        )
        (setq ptList (strcat ptList "]"))
      )
    )

    ;; 文字データの処理を追加
    (if (or (= etype "TEXT") (= etype "MTEXT"))
      (progn
        (setq txt (cdr (assoc 1 ed)))
        (setq h (cdr (assoc 40 ed)))
        (setq pt (assoc 10 ed))
        (setq ptList (strcat "{\"text\":\"" (sanitize-json-string txt) "\",\"x\":" (rtos (cadr pt) 2 8) ",\"y\":" (rtos (caddr pt) 2 8) ",\"h\":" (rtos h 2 8) "}"))
      )
    )

    (if (/= ptList "")
      (progn
        (if (< i (1- (sslength sel)))
          (setq ptList (strcat ptList ","))
        )
        (write-line ptList file)
      )
    )
    (setq i (1+ i))
  )
  (write-line "]" file)
  (close file)
  (setvar "DIMZIN" old_dimzin)
  (princ "\nJSON出力が完了しました")
  (princ)
)