How to import a JSON file into MATLAB programatically? - json

I am trying to load my data from a JSON file into MATLAB that is delimited with ,.
The format of my data is as follows:
{"created_at": "Mon Oct 27 20:35:47 +0000 2014", "tweet": "Silver Finished Up, Gold, Copper, Crude Oil, Nat Gas Down - Live Trading News http://t.co/jNLTUIgHwA", "id": 526834668759285761, "sentiment": "negative"}
{"created_at": "Mon Oct 27 20:36:21 +0000 2014", "tweet": "Gold, Silver slips on lacklustre demand- The Economic Times http://t.co/Jd5Tn9ctfX", "id": 526834810300289024, "sentiment": "negative"}
How would I do so?

As of version 2016b, Matlab has integrated json support.
See:
https://www.mathworks.com/help/matlab/ref/jsondecode.html
In short, you do:
jsonData = jsondecode(fileread('file.json'));

Use jsonLab
One line to read:
tweet_info = loadjson('~/Desktop/test.json')
Here's what's stored in tweet_info{1}
created_at: 'Mon Oct 27 20:35:47 +0000 2014'
tweet: 'Silver Finished Up, Gold, Copper, Crude Oil, Nat Gas Down - Live Trading News http://t.co/jNLTUIgHwA'
id: 5.2683e+17
sentiment: 'negative'
Here's what stored in the test.json file
{"created_at": "Mon Oct 27 20:35:47 +0000 2014", "tweet": "Silver Finished Up, Gold, Copper, Crude Oil, Nat Gas Down - Live Trading News http://t.co/jNLTUIgHwA", "id": 526834668759285761, "sentiment": "negative"}
{"created_at": "Mon Oct 27 20:36:21 +0000 2014", "tweet": "Gold, Silver slips on lacklustre demand- The Economic Times http://t.co/Jd5Tn9ctfX", "id": 526834810300289024, "sentiment": "negative"}

Related

flat json to structured mapping

How do I map the following in dataweave 2.0 .. I am able to split the first element .. I need to form my list based of the first element in my input and parse out the remaining under appropriate indexes. for e.g. when there is a 5th value something.pem, there will be subsequent values for it and the output array need to be populated
%dw 2.0
output application/json
---
payload[0] splitBy (/\s/)
map (certs, index) -> {
certsname: certs,
validfrome: (payload filter ($$<=4)) [index+1],
validto: (payload filter ($$<=4)) [index+2],
issuer: (payload filter ($$<=4)) [index+3],
subject: (payload filter ($$<=5)) [index+4]
}
Input
[
"auth0.pem maximo.cer synovos.pem veevavault.pem",
"notBefore=Apr 30 00:00:00 2020 GMT",
"notAfter=May 30 12:00:00 2021 GMT",
"issuer= /C=US/O=Amazon/OU=Server CA 1B/CN=Amazon",
"subject= /CN=auth0.com",
"notBefore=Feb 5 18:02:21 2020 GMT",
"notAfter=Apr 5 18:44:22 2021 GMT",
"issuer= /C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./OU=http://certs.starfieldtech.com/repository//CN=Starfield Secure Certificate Authority - G2",
"subject= /OU=Domain Control Validated/CN=*.corp.amazon.com",
"notBefore=Aug 1 17:57:31 2020 GMT",
"notAfter=Aug 15 17:57:31 2020 GMT",
"issuer= /C=US/ST=California/O=Zscaler Inc./OU=Zscaler Inc./CN=Zscaler Intermediate Root CA (zscloud.net) (t)",
"subject= /OU=Domain Control Validated/CN=*.synovos.com",
"notBefore=Jan 23 00:00:00 2018 GMT",
"notAfter=Jan 27 12:00:00 2021 GMT",
"issuer= /C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA",
"subject= /C=US/ST=California/L=Pleasanton/O=Veeva Systems, Inc./OU=Vault/CN=*.veevavault.com"
]
to an Output
[
{
"certsname": "auth0.pem",
"validfrome": "notBefore=Apr 30 00:00:00 2020 GMT",
"validto": "notAfter=May 30 12:00:00 2021 GMT",
"issuer": "issuer= /C=US/O=Amazon/OU=Server CA 1B/CN=Amazon",
"subject": "subject= /CN=auth0.com"
},
{
"certsname": "maximo.cer",
"validfrom": "notBefore=Feb 5 18:02:21 2020 GMT",
"validto": "Apr 5 18:44:22 2021 GMT",
"issuer": "/C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./OU=http://certs.starfieldtech.com/repository//CN=Starfield Secure Certificate Authority - G2\"",
"subject": "subject= /OU=Domain Control Validated/CN=*.corp.amazon.com"
},
{
"certsname": "synovos.pem",
"validfrom": "notBefore=Aug 1 17:57:31 2020 GMT",
"validto": "notAfter=Aug 15 17:57:31 2020 GMT",
"issuer": "issuer= /C=US/ST=California/O=Zscaler Inc./OU=Zscaler Inc./CN=Zscaler Intermediate Root CA (zscloud.net) (t)",
"subject": "subject= /OU=Domain Control Validated/CN=*.synovos.com"
},
{
"certsname": "veevavault.pem",
"validfrom": "notBefore=Jan 23 00:00:00 2018 GMT",
"validto": "notAfter=Jan 27 12:00:00 2021 GMT",
"issuer": "issuer= /C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA",
"subject": "subject= /C=US/ST=California/L=Pleasanton/O=Veeva Systems, Inc./OU=Vault/CN=*.veevavault.com"
}
]
Maybe you can optimize this.
%dw 2.0
output application/json
var validFrom = ((payload map {
(($$): $) if($ contains("notBefore"))
}) - ({}))
var validTo = ((payload map {
(($$): $) if($ contains("notAfter"))
}) - ({}))
var issuer = ((payload map {
(($$): $) if($ contains("issuer"))
}) - ({}))
var subject = ((payload map {
(($$): $) if($ contains("subject"))
}) - ({}))
---
payload[0] splitBy (/\s/) map {
certsname: $,
validfrom: validFrom[$$][0],
validto: validTo[($$)][0],
issuer: issuer[$$][0],
subject: subject[$$][0]
}
The input array is a pretty bad structure. I advice to make it more structured instead. If you can't change it, then below is the script I made to get the expected output.
Script:
%dw 2.0
output application/json
import * from dw::core::Arrays
import * from dw::core::Strings
var certs=payload[0] splitBy (/\s/)
var attributes=payload[1 to sizeOf(payload)-1]
var certAttributes=attributes divideBy 4 // assume there are exactly 4 attributes per certificate
fun splitAttribute(a)={ (substringBefore(a,'=')): substringAfter (a, '=')}
fun attributesToObject(x)=x reduce ((item, accumulator={}) -> accumulator ++ item)
---
certAttributes map (
{certsname: certs[$$]} ++ attributesToObject( $ map splitAttribute($))
)
Output:
[
{
"certsname": "auth0.pem",
"notBefore": "Apr 30 00:00:00 2020 GMT",
"notAfter": "May 30 12:00:00 2021 GMT",
"issuer": " /C=US/O=Amazon/OU=Server CA 1B/CN=Amazon",
"subject": " /CN=auth0.com"
},
{
"certsname": "maximo.cer",
"notBefore": "Feb 5 18:02:21 2020 GMT",
"notAfter": "Apr 5 18:44:22 2021 GMT",
"issuer": " /C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./OU=http://certs.starfieldtech.com/repository//CN=Starfield Secure Certificate Authority - G2",
"subject": " /OU=Domain Control Validated/CN=*.corp.amazon.com"
},
{
"certsname": "synovos.pem",
"notBefore": "Aug 1 17:57:31 2020 GMT",
"notAfter": "Aug 15 17:57:31 2020 GMT",
"issuer": " /C=US/ST=California/O=Zscaler Inc./OU=Zscaler Inc./CN=Zscaler Intermediate Root CA (zscloud.net) (t)",
"subject": " /OU=Domain Control Validated/CN=*.synovos.com"
},
{
"certsname": "veevavault.pem",
"notBefore": "Jan 23 00:00:00 2018 GMT",
"notAfter": "Jan 27 12:00:00 2021 GMT",
"issuer": " /C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA",
"subject": " /C=US/ST=California/L=Pleasanton/O=Veeva Systems, Inc./OU=Vault/CN=*.veevavault.com"
}
]
Try this code:
%dw 2.0
output application/json
fun getValue(key) = payload[?($ contains key)]
---
payload[0] splitBy (" ") map {
certsname: $,
validfrom: getValue("notBefore")[($$)],
validto: getValue("notAfter")[($$)],
issuer: getValue("issuer")[($$)],
subject: getValue("subject")[($$)]
}

multiple JSON objects into R from one txt file

I am very new to Json files. I scraped a txt file with some million json objects such as:
{
"created_at":"Mon Oct 14 21:04:25 +0000 2013",
"default_profile":true,
"default_profile_image":true,
"description":"...",
"followers_count":5,
"friends_count":560,
"geo_enabled":true,
"id":1961287134,
"lang":"de",
"name":"Peter Schmitz",
"profile_background_color":"C0DEED",
"profile_background_image_url":"http://abs.twimg.com/images/themes",
"utc_offset":-28800,
...
}
{
"created_at":"Fri Oct 17 20:04:25 +0000 2015",
...
}
I want to extract the columns into a data frame in R:
Variable Value
created_at X
default_profile Y
…
In general, similar to how done here(multiple Json objects in one file extract by python) in Python. If anyone has an idea or a suggestion, help would be much appreciated! Thank you!
Here is an example on how you could approach it with two objects. I assume you were able to read the JSON from a file, otherwise see here.
myjson = '{"created_at": "Mon Oct 14 21:04:25 +0000 2013", "default_profile": true,
"default_profile_image": true, "description": "...", "followers_count":
5, "friends_count": 560, "geo_enabled": true, "id": 1961287134, "lang":
"de", "name": "Peter Schmitz", "profile_background_color": "C0DEED",
"profile_background_image_url": "http://abs.twimg.com/images/themes", "utc_offset": -28800}
{"created_at": "Mon Oct 15 21:04:25 +0000 2013", "default_profile": true,
"default_profile_image": true, "description": "...", "followers_count":
5, "friends_count": 560, "geo_enabled": true, "id": 1961287134, "lang":
"de", "name": "Peter Schmitz", "profile_background_color": "C0DEED",
"profile_background_image_url": "http://abs.twimg.com/images/themes", "utc_offset": -28800}
'
library("rjson")
# Split the text into a list of all JSON objects. I chose '!x!x!' pretty randomly.. There may be better ways of keeping the brackets wile splitting.
my_json_objects = head(strsplit(gsub('\\}','\\}!x!x!', myjson),'!x!x!')[[1]],-1)
# read the text as JSON objects
json_data <- lapply(my_json_objects, function(x) {fromJSON(x)})
# Transform to dataframes
json_data <- lapply(json_data, function(x) {data.frame(val=unlist(x))})
Output:
[[1]]
val
created_at Mon Oct 14 21:04:25 +0000 2013
default_profile TRUE
default_profile_image TRUE
description ...
followers_count 5
friends_count 560
geo_enabled TRUE
id 1961287134
lang de
name Peter Schmitz
profile_background_color C0DEED
profile_background_image_url http://abs.twimg.com/images/themes
utc_offset -28800
[[2]]
val
created_at Mon Oct 15 21:04:25 +0000 2013
default_profile TRUE
default_profile_image TRUE
description ...
followers_count 5
friends_count 560
geo_enabled TRUE
id 1961287134
lang de
name Peter Schmitz
profile_background_color C0DEED
profile_background_image_url http://abs.twimg.com/images/themes
utc_offset -28800
Hope this helps!

Any way to reformat "json" file so I can extract the data?

A colleague of mine sent this file over to me asking me to extract the data into a database.... issue is, it is not formatted correctly. (It is supposed to be a json file... even sent as orders.json).
Here is the file contents (The other files are much larger, this is just a snippet):
[
"Buyer: Jane Doe ",
[
"jane Doe",
"Street Here",
"State, ZIP",
"Phone : 8888888"
],
"Ship By: Wed, Oct 11, 2017 to Thu, Oct 12, 2017",
"Deliver By: Mon, Oct 16, 2017 to Thu, Oct 19, 2017",
"Shipping Service: Standard",
[
[
"Product name",
"SKU: 99999999999",
"ASIN: 999999999",
"Condition: New",
"Listing ID: 99999999999",
"Order Item ID: 9999999999",
"Customizations:",
"Size: 16 Inches",
"Monogram Letters: BSA",
"Color: Unpainted (goes out in 48 hrs)"
]
],
"A",
"Wed, Oct 4, 2017, 8:03 PM PT",
"114-7275553-4341048",
[
"1"
]
]
I believe I will have to go through this slowly and use unnecessary methods to get this to look nice and work... unless I am missing something?
As of right now I can't really access the data in a efficient way.

Convert GMT date format to only time format

I am building an html application using AngularJS wherein I want to display the json file data on html page. Can anyone help me to Convert GMT date format from json file to hour:minutes AM/PM
Json file looks like this:
[
{
"startTime": "Sun May 24 2015 01:00:00 GMT+0530 (IST)",
"endTime": "Sun May 24 2015 01:30:00 GMT+0530 (IST)",
"title": "Event 1"
},
{
"startTime": "Sun May 24 2015 04:00:00 GMT+0530 (IST)",
"endTime": "Sun May 24 2015 06:00:00 GMT+0530 (IST)",
"title": "Event 2"
},
{
"startTime": "Sat May 23 2015 20:00:00 GMT+0530 (IST)",
"endTime": "Sat May 23 2015 21:30:00 GMT+0530 (IST)",
"title": "Event 3"
},
{
"startTime": "Sat May 23 2015 21:30:00 GMT+0530 (IST)",
"endTime": "Sat May 23 2015 22:15:00 GMT+0530 (IST)",
"title": "Event 4"
},
{
"startTime": "Sun May 24 2015 02:00:00 GMT+0530 (IST)",
"endTime": "Sun May 24 2015 03:00:00 GMT+0530 (IST)",
"title": "Event 5"
}
]
assign your json data to a scope variable:
scope.data = [
{
"startTime": "Sun May 24 2015 01:00:00 GMT+0530 (IST)",
"endTime": "Sun May 24 2015 01:30:00 GMT+0530 (IST)",
"title": "Event 1"
},
...
];
in your html, you can use angularjs date filter like this:
<div>{{ data[0] | date: 'h:m a' }}</div>
The link provided by #worldask says
Date to format either as Date object, milliseconds (string or number) or various ISO 8601
datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its shorter
versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If
no timezone is specified in the string input, the time is considered
to be in the local timezone.
So I am using a custom filter for converting Sun May 24 2015 01:00:00 GMT+0530 (IST) to milliseconds and then using angular filter to show as hh:mm AM/PM
HTML
<div ng-repeat="date in dateJson">
{{date.startTime | myDateFilter | date:'hh: mm a' }}
</div>
dateJson is your sample json...
custom filter
app.filter('myDateFilter', function() {
return function(dateString) {
var date = new Date(dateString)
// converting to milliseconds
dateString = date.getTime();
return dateString;
}
});
SAMPLE PLUNKER

How does DROPBOX response (JSON) data look like?

Good day, does anyone know typical JSON response data, when accessing a file? I am more interested in whether or not one can check if a response object is a file or a directory!
Thanx mates
This is a common JSON answer, when you try to get information about file/folder.
You can see more information about request here
if is_dir is true, it's a folder.
{
"size": "225.4KB",
"rev": "35e97029684fe",
"thumb_exists": false,
"bytes": 230783,
"modified": "Tue, 19 Jul 2011 21:55:38 +0000",
"client_mtime": "Mon, 18 Jul 2011 18:04:35 +0000",
"path": "/Getting_Started.pdf",
"is_dir": false,
"icon": "page_white_acrobat",
"root": "dropbox",
"mime_type": "application/pdf",
"revision": 220823
}