mirror of
https://github.com/stedolan/jq.git
synced 2024-05-11 05:55:39 +00:00
373 lines
14 KiB
HTML
373 lines
14 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset=UTF-8>
|
|
<title>Tutorial | jq</title>
|
|
<link rel="stylesheet" href="/jq/bootstrap/css/bootstrap.css" type="text/css">
|
|
<link rel="stylesheet" href="/jq/css/base.css" type="text/css">
|
|
<!--[if IE]>
|
|
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
<![endif]-->
|
|
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
|
|
<script src="/jq/bootstrap/js/bootstrap.js"></script>
|
|
|
|
</head>
|
|
<body id="tutorial">
|
|
|
|
<div class="navbar navbar-inverse navbar-fixed-top">
|
|
<div class="navbar-inner">
|
|
<div class="container">
|
|
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
</button>
|
|
<a class="brand" href="/jq/">jq</a>
|
|
<div class="nav-collapse collapse">
|
|
<ul class="nav">
|
|
|
|
<li class="active" >
|
|
<a href="/jq/tutorial/">Tutorial</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="/jq/download/">Download</a>
|
|
</li>
|
|
|
|
<li >
|
|
<a href="/jq/manual/">Manual</a>
|
|
</li>
|
|
|
|
<li><a href="https://github.com/stedolan/jq/issues">Issues</a></li>
|
|
<li><a href="https://github.com/stedolan/jq">Source</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="container">
|
|
|
|
<div class="row">
|
|
<h1>Tutorial</h1>
|
|
|
|
|
|
<p>Twitter have a JSON API, so let’s play with that. This URL gets us the last 5 tweets about JSON:</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="tutorial-example">
|
|
<div class="accordion-heading">
|
|
<pre>curl 'http://search.twitter.com/search.json?q=json&rpp=5&include_entities=true'</pre>
|
|
<a data-toggle="collapse" href="#result1">Show result</a>
|
|
</div>
|
|
<div id="result1" class="accordion-body collapse"><pre>{"completed_in":0.108,"max_id":247677287108067328,"max_id_str":"247677287108067328","next_page":"?page=2&max_id=247677287108067328&q=json&rpp=5&include_entities=1","page":1,"query":"json","refresh_url":"?since_id=247677287108067328&q=json&include_entities=1","results":[{"created_at":"Mon, 17 Sep 2012 12:44:01 +0000","entities":{"hashtags":[],"urls":[{"url":"http:\/\/t.co\/XRvh1ZVw","expanded_url":"http:\/\/jase.im\/Ri7I0M","display_url":"jase.im\/Ri7I0M","indices":[112,132]}],"user_mentions":[{"screen_name":"imagemechanics","name":"Jason Cotterell","id":57271393,"id_str":"57271393","indices":[3,18]}]},"from_user":"_AaronNg","from_user_id":79771704,"from_user_id_str":"79771704","from_user_name":"NgChenChong","geo":null,"id":247677287108067328,"id_str":"247677287108067328","iso_language_code":"en","metadata":{"result_type":"recent"},"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2523558403\/ek8mo4j4beq84iw28gjl_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2523558403\/ek8mo4j4beq84iw28gjl_normal.jpeg","source":"<a href="http:\/\/twitter.com\/">web<\/a>","text":"RT @imagemechanics: iPhone 5 website teardown: How Apple compresses video using JPEG, JSON, and <canvas>.\nhttp:\/\/t.co\/XRvh1ZVw","to_user":null,"to_user_id":0,"to_user_id_str":"0","to_user_name":null}, ...
|
|
</pre></div>
|
|
</div>
|
|
|
|
|
|
|
|
<p>There’s lots of info and no whitespace, so to make it a bit more legible we pipe it through jq, telling jq to just spit the input back at us using the expression <code>.</code>:</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="tutorial-example">
|
|
<div class="accordion-heading">
|
|
<pre>curl 'http://search.twitter.com/search.json?q=json&rpp=5&include_entities=true' | jq '.'</pre>
|
|
<a data-toggle="collapse" href="#result2">Show result</a>
|
|
</div>
|
|
<div id="result2" class="accordion-body collapse"><pre>
|
|
{
|
|
"since_id_str": "0",
|
|
"since_id": 0,
|
|
"results_per_page": 5,
|
|
"completed_in": 0.108,
|
|
"max_id": 247677287108067330,
|
|
"max_id_str": "247677287108067328",
|
|
"next_page": "?page=2&max_id=247677287108067328&q=json&rpp=5&include_entities=1",
|
|
"page": 1,
|
|
"query": "json",
|
|
"refresh_url": "?since_id=247677287108067328&q=json&include_entities=1",
|
|
"results": [
|
|
{
|
|
"from_user_name": "NgChenChong",
|
|
"from_user_id_str": "79771704",
|
|
"from_user_id": 79771704,
|
|
"from_user": "_AaronNg",
|
|
"iso_language_code": "en",
|
|
"text": "RT @imagemechanics: iPhone 5 website teardown: How Apple compresses video using JPEG, JSON, and <canvas>.\nhttp://t.co/XRvh1ZVw",
|
|
"to_user": null
|
|
/* lots more fields... */
|
|
},
|
|
/* lots more results... */
|
|
]
|
|
}
|
|
</pre></div>
|
|
</div>
|
|
|
|
|
|
|
|
<p>Let’s pull out the first tweet:</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="tutorial-example">
|
|
<div class="accordion-heading">
|
|
<pre>curl 'http://search.twitter.com/search.json?q=json&rpp=5&include_entities=true' | jq '.results[0]'</pre>
|
|
<a data-toggle="collapse" href="#result3">Show result</a>
|
|
</div>
|
|
<div id="result3" class="accordion-body collapse"><pre>{
|
|
"from_user_name": "NgChenChong",
|
|
"from_user_id_str": "79771704",
|
|
"from_user_id": 79771704,
|
|
"from_user": "_AaronNg",
|
|
"iso_language_code": "en",
|
|
"text": "RT @imagemechanics: iPhone 5 website teardown: How Apple compresses video using JPEG, JSON, and <canvas>.\nhttp://t.co/XRvh1ZVw",
|
|
"to_user": null
|
|
/* lots more fields... */
|
|
},
|
|
</pre></div>
|
|
</div>
|
|
|
|
|
|
|
|
<p>For the rest of the examples, I’ll leave out the <code>curl</code> command - it’s not going to change.</p>
|
|
|
|
<p>There’s still a lot of info we don’t care about there, so we’ll restrict it down to the most interesting fields.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="tutorial-example">
|
|
<div class="accordion-heading">
|
|
<pre>jq '.results[0] | {from_user, text}'</pre>
|
|
<a data-toggle="collapse" href="#result4">Show result</a>
|
|
</div>
|
|
<div id="result4" class="accordion-body collapse"><pre>{
|
|
"text": "RT @imagemechanics: iPhone 5 website teardown: How Apple compresses video using JPEG, JSON, and <canvas>.\nhttp://t.co/XRvh1ZVw",
|
|
"from_user": "_AaronNg"
|
|
}
|
|
</pre></div>
|
|
</div>
|
|
|
|
|
|
|
|
<p>The <code>|</code> operator in jq feeds the output of one filter (<code>.results[0]</code> which gets the first element of the results array) into the input of another (<code>{from_user, text}</code> which builds an object of those two fields).</p>
|
|
|
|
<p>Now let’s get the rest of the tweets:</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="tutorial-example">
|
|
<div class="accordion-heading">
|
|
<pre>jq '.results[] | {from_user, text}'</pre>
|
|
<a data-toggle="collapse" href="#result5">Show result</a>
|
|
</div>
|
|
<div id="result5" class="accordion-body collapse"><pre>{
|
|
"text": "RT @imagemechanics: iPhone 5 website teardown: How Apple compresses video using JPEG, JSON, and <canvas>.\nhttp://t.co/XRvh1ZVw",
|
|
"from_user": "_AaronNg"
|
|
}
|
|
{
|
|
"text": "RT @_kud: iPhone 5 website teardown: How Apple compresses video using JPEG, JSON, and <canvas> -- http://t.co/Lhp92IqD",
|
|
"from_user": "blouerat"
|
|
}
|
|
{
|
|
"text": "Dynamic Forms Mobile App by pmadiset: Few Forms details are hosted on our server in the form of JSON. This JSON ... http://t.co/7KALdWaX",
|
|
"from_user": "cebu_iphone"
|
|
}
|
|
{
|
|
"text": "iPhone 5 website insanity - Video compressing using JPEG, JSON, and <canvas> http://t.co/28Jesbio (Oh #Apple, U So #Awesome...)",
|
|
"from_user": "dieswaytoofast"
|
|
}
|
|
{
|
|
"text": "RT @umutm: A very nice web-based JSON editor - http://t.co/M70snaIf",
|
|
"from_user": "Leolik"
|
|
}
|
|
</pre></div>
|
|
</div>
|
|
|
|
|
|
|
|
<p><code>.results[]</code> returns each element of the results array, one at a time, which are all fed into <code>{from_user, text}</code>.</p>
|
|
|
|
<p>Data in jq is represented as streams of JSON values - every jq expression runs for each value in its input stream, and can produce any number of values to its output stream.</p>
|
|
|
|
<p>Streams are serialised by just separating JSON values with whitespace. This is a <code>cat</code>-friendly format - you can just join two JSON streams together and get a valid JSON stream.</p>
|
|
|
|
<p>If you want to get the output as a single array, you can tell jq to “collect” all of the answers by wrapping the filter in square brackets:</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="tutorial-example">
|
|
<div class="accordion-heading">
|
|
<pre>jq '[.results[] | {from_user, text}]'</pre>
|
|
<a data-toggle="collapse" href="#result6">Show result</a>
|
|
</div>
|
|
<div id="result6" class="accordion-body collapse"><pre>[
|
|
{
|
|
"text": "RT @imagemechanics: iPhone 5 website teardown: How Apple compresses video using JPEG, JSON, and <canvas>.\nhttp://t.co/XRvh1ZVw",
|
|
"from_user": "_AaronNg"
|
|
},
|
|
{
|
|
"text": "RT @_kud: iPhone 5 website teardown: How Apple compresses video using JPEG, JSON, and <canvas> -- http://t.co/Lhp92IqD",
|
|
"from_user": "blouerat"
|
|
},
|
|
{
|
|
"text": "Dynamic Forms Mobile App by pmadiset: Few Forms details are hosted on our server in the form of JSON. This JSON ... http://t.co/7KALdWaX",
|
|
"from_user": "cebu_iphone"
|
|
},
|
|
{
|
|
"text": "iPhone 5 website insanity - Video compressing using JPEG, JSON, and <canvas> http://t.co/28Jesbio (Oh #Apple, U So #Awesome...)",
|
|
"from_user": "dieswaytoofast"
|
|
},
|
|
{
|
|
"text": "RT @umutm: A very nice web-based JSON editor - http://t.co/M70snaIf",
|
|
"from_user": "Leolik"
|
|
}
|
|
]
|
|
</pre></div>
|
|
</div>
|
|
|
|
|
|
|
|
<hr />
|
|
<p>Next, let’s try getting the URLs out of those API results as well. In each tweet, the Twitter API includes a field called “entities” which looks like this:</p>
|
|
|
|
<pre><code>{
|
|
"user_mentions": [],
|
|
"urls": [{
|
|
"indices": [83, 103],
|
|
"display_url": "bit.ly/StniqT",
|
|
"expanded_url": "http://bit.ly/StniqT",
|
|
"url": "http://t.co/28Jesbio"
|
|
}],
|
|
"hashtags": [
|
|
{"indices": [108, 114], "text": "Apple" },
|
|
{"indices": [121, 129], "text": "Awesome"}
|
|
]
|
|
}</code></pre>
|
|
|
|
<p>We want to pull out all of the “url” fields inside that array of url objects, and make a simple list of strings to go along with the “from_user” and “text” fields we already have.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="tutorial-example">
|
|
<div class="accordion-heading">
|
|
<pre>jq '.results[] | {from_user, text, urls: [.entities.urls[].url]}'</pre>
|
|
<a data-toggle="collapse" href="#result7">Show result</a>
|
|
</div>
|
|
<div id="result7" class="accordion-body collapse"><pre>{
|
|
"urls": [
|
|
"http://t.co/XRvh1ZVw"
|
|
],
|
|
"text": "RT @imagemechanics: iPhone 5 website teardown: How Apple compresses video using JPEG, JSON, and <canvas>.\nhttp://t.co/XRvh1ZVw",
|
|
"from_user": "_AaronNg"
|
|
}
|
|
{
|
|
"urls": [
|
|
"http://t.co/Lhp92IqD"
|
|
],
|
|
"text": "RT @_kud: iPhone 5 website teardown: How Apple compresses video using JPEG, JSON, and <canvas> -- http://t.co/Lhp92IqD",
|
|
"from_user": "blouerat"
|
|
}
|
|
{
|
|
"urls": [
|
|
"http://t.co/7KALdWaX"
|
|
],
|
|
"text": "Dynamic Forms Mobile App by pmadiset: Few Forms details are hosted on our server in the form of JSON. This JSON ... http://t.co/7KALdWaX",
|
|
"from_user": "cebu_iphone"
|
|
}
|
|
{
|
|
"urls": [
|
|
"http://t.co/28Jesbio"
|
|
],
|
|
"text": "iPhone 5 website insanity - Video compressing using JPEG, JSON, and <canvas> http://t.co/28Jesbio (Oh #Apple, U So #Awesome...)",
|
|
"from_user": "dieswaytoofast"
|
|
}
|
|
{
|
|
"urls": [
|
|
"http://t.co/M70snaIf"
|
|
],
|
|
"text": "RT @umutm: A very nice web-based JSON editor - http://t.co/M70snaIf",
|
|
"from_user": "Leolik"
|
|
}
|
|
</pre></div>
|
|
</div>
|
|
|
|
|
|
|
|
<p>Here we’re making an object as before, but this time the urls field is being set to <code>[.entities.urls[].url]</code>, which collects all of the URLs defined in the entities object.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<hr />
|
|
<p>Here endeth the tutorial! There’s lots more to play with, go read <a href='/manual'>the manual</a> if you’re interested, and <a href='/download'>download jq</a> if you haven’t already.</p>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
</div>
|
|
<footer>
|
|
<div class="container">
|
|
<p>This website is made with <a href='http://www.tinytree.info'>Bonsai</a> and <a href='http://twitter.github.com/bootstrap/'>Twitter Boostrap</a>, themed with <a href='http://bootswatch.com'>Bootswatch</a>.</p>
|
|
|
|
<p>jq is licensed under the MIT license (code) and the <a href='http://creativecommons.org/licenses/by/3.0/'>CC-BY-3.0</a> license (docs).</p>
|
|
</div>
|
|
</footer>
|
|
|
|
|
|
</body>
|
|
</html>
|