Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I was wondering if there is a good way for JSON files to be listed with the listings package.

The only language definition I could come up with, is this:

\lstdefinelanguage{json}
{
    morestring=[b]",
    morestring=[d]'
}

Now, this highlights the strings used in JSON files, but the important syntactical things in JSON are the curly braces, the square brackets, commas, and colons. I have sadly no Idea how I could make them be highlighted in a different manner. I tried adding { and } as identifier or as keywords, but it didn't work.

I'd really like to make listed JSON files appear nicer, since on a project I need to document I'd really need it. Also, I couldn't find a JSON definition for that on the internet, anywhere else.

On a more general thought: can I highlight all numerals with listings?

share|improve this question
    
the full json definition is on the page json.org –  David Carlisle Nov 17 '12 at 15:04
    
@DavidCarlisle yes, I know that, but I still don't know how to construct a language definition for listings. Symbols such as { are not accepted as keywords. Or I'm doing something wrong. –  polemon Nov 17 '12 at 15:39
    
ah sorry I misread your comment –  David Carlisle Nov 17 '12 at 15:55
    
I updated my answer; I initially overlooked the numerals issue; now I've added it to my answer. –  Gonzalo Medina Nov 17 '12 at 16:55
    
both single- and double-quoted strings should probably have the [b] type as they are backslash-escaped in JSON (and Javascript). –  mlc Apr 8 at 20:01
add comment

1 Answer 1

up vote 13 down vote accepted

Here's one possibility for the colon, comma, braces, square brackets, and numbers, using the literate key:

\documentclass{article}
\usepackage{bera}% optional: just to have a nice mono-spaced font
\usepackage{listings}
\usepackage{xcolor}

\colorlet{punct}{red!60!black}
\definecolor{background}{HTML}{EEEEEE}
\definecolor{delim}{RGB}{20,105,176}
\colorlet{numb}{magenta!60!black}

\lstdefinelanguage{json}{
    basicstyle=\normalfont\ttfamily,
    numbers=left,
    numberstyle=\scriptsize,
    stepnumber=1,
    numbersep=8pt,
    showstringspaces=false,
    breaklines=true,
    frame=lines,
    backgroundcolor=\color{background},
    literate=
     *{0}{{{\color{numb}0}}}{1}
      {1}{{{\color{numb}1}}}{1}
      {2}{{{\color{numb}2}}}{1}
      {3}{{{\color{numb}3}}}{1}
      {4}{{{\color{numb}4}}}{1}
      {5}{{{\color{numb}5}}}{1}
      {6}{{{\color{numb}6}}}{1}
      {7}{{{\color{numb}7}}}{1}
      {8}{{{\color{numb}8}}}{1}
      {9}{{{\color{numb}9}}}{1}
      {:}{{{\color{punct}{:}}}}{1}
      {,}{{{\color{punct}{,}}}}{1}
      {\{}{{{\color{delim}{\{}}}}{1}
      {\}}{{{\color{delim}{\}}}}}{1}
      {[}{{{\color{delim}{[}}}}{1}
      {]}{{{\color{delim}{]}}}}{1},
}

\begin{document}

\begin{lstlisting}[language=json,firstnumber=1]
{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}
0123456789
\end{lstlisting}

\end{document}

enter image description here

share|improve this answer
    
Cool! Thanks a lot! –  polemon Nov 17 '12 at 19:10
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.