Convert string loaded from text file to an array object in JavaScript - javascript

I have the following object
{
value: 20,
color:"#878BB6"
},
{
value : 40,
color : "#4ACAB4"
}
loaded from a text file abc.txt in my local directory in the server.
I want to convert this into an array object. I tried doing
var string = "{
value: 20,
color:"#878BB6"
},
{
value : 40,
color : "#4ACAB4"
}"
var array = JSON.parse("[" + string + "]");
alert(array);
Nothing happens unfortunately. Help appreciated !

You can use "eval" to accomplish what you are attempting.
var s = '{value: 20, color:"#878BB6" },' +
'{value : 40, color : "#4ACAB4"}';
var arr = eval('[' + s + ']');
alert(arr[0].value);
Also, in order for JSON.parse to parse it the string needs to be valid JSON. So you'll need to have quotes around the object property names. Like the following:
var s = '{"value": 20, "color":"#878BB6" },' +
'{"value": 40, "color": "#4ACAB4"}';
var arr2 = JSON.parse('[' + s + ']');
alert(arr2[1].value);
Although it would be better to modify the process for generating the text file to contain valid JSON if you can. Then you could use jQuery or some other method of just loading the JSON from the file directly.

Related

Formating JSON object, From single quotation to double

I'm using a data-set given to me and I'm trying to parse (Using Node) the JSON objects returned to me,
Turns out they are all using single quotations, and from my research JSON uses double.
Example of a JSON object I get returned!
{
'cast_id': 16,
'character': 'Alexander Haig',
'credit_id': '52fe43c59251416c7501d72d',
'gender': 2,
'id': 6280,
'name': 'Powers Boothe',
'order': 2,
'profile_path': '/3nNL6AvMAYq0BmHKM79RnRZVq3i.jpg'
},
I've been using str.replace() to sort the objects out before JSON.parse() which was fine untill I found objects like this one
{
'cast_id': 26,
'character': '"Jack Jones"',
'credit_id': '52fe43c59251416c7501d751',
'gender': 2,
'id': 6840,
'name': 'Larry Hagman',
'order': 16,
'profile_path': '/40PVsGp5Wp5kbUhAefLHqjqbarc.jpg'
},
Notice the 'character': '"Jack Jones"', This has been causing me all types of issues!
I there a library that will help parse this all for me?
Am I missing something?
FYI:
I can't access each record as the JSON objects aren't stored separately instead, as a long string including up to 60 JSON objects.
I currently have a function that helps parse the data:
function formatJSON(cast) {
cast = cast.replace(/(\w) "(\w)/g, "$1 *$2");
cast = cast.replace(/(\w)" /g, "$1* ");
cast = cast.replace(/': '/g, '": "');
cast = cast.replace(/', '/g, '", "' );
cast = cast.replace(/'},/g, '"},');
cast = cast.replace(/': /g, '": ');
cast = cast.replace(/, '/g, ', "');
cast = cast.replace(/{'/g, '{"');
cast = cast.replace(/: None}/g, ': "None"}');
cast = cast.replace(/'}/g, '"}');
return cast;
}
Update
The data reportedly extracts nicely in python as a dictionary using ast.literal_eval()
By default, you don't need to replace a string which is wrapped by double quotes with the same string contains single quote. There is no difference between 'Jack Jones' and "Jack Jones" since all of them are string.
In your case, you're trying to replace something like this example:
var str = '\'Jack Jones\''.replace(/'/g, '"');
console.log('\'' + str + '\'');
So, if you want to wrap all of properties names and values by double quotes, you can use JSON.stringify and JSON.parse like this:
var cast = {
'cast_id': 16,
'character': 'Alexander Haig',
'credit_id': '52fe43c59251416c7501d72d',
'gender': 2,
'id': 6280,
'name': 'Powers Boothe',
'order': 2,
'profile_path': '/3nNL6AvMAYq0BmHKM79RnRZVq3i.jpg'
};
cast = JSON.stringify(cast);
cast = JSON.parse(cast);
console.log(cast);

restAPI- how to format JSON value

I am getting JSON value from my server and it works well. But I want to customize my JSON value. I have two questions:
First, when I get region value, I get it like ["USA"],["Mexico"],["Canada"]. Is there a way I can ignore the double quotes/brackets and just get the strings values like USA, Mexico, Canada?
Second, when I get the regDate value I get the whole data like 2018-10-31T07:53:12.000Z instead, can I ignore some values and get it like 2018-10-31 07:53?
{
"result": "ok",
"data": [
{
"idx": 1,
"region": "[\"USA \", \"Mexico \", \"Canada \"]",
"regDate": "2018-10-31T07:53:12.000Z"
}
]
}
Seems that your region data was double-encoded. In javascript, you'll want to decode that, e.g.
const response = {
"result": "ok",
"data": [
{
"idx": 1,
"region": "[\"USA \", \"Mexico \", \"Canada \"]",
"regDate": "2018-10-31T07:53:12.000Z"
}
]
};
const regions = JSON.parse(response.data[0].region);
For time formatting, you could use the built-in Javascript Date type, such as..
const regDate = new Date(response.data[0].regDate);
const regDatestr =
regDate.getUTCFullYear() + '-' +
regDate.getUTCMonth() + '-' +
regDate.getDate() + ' ' +
regDate.getUTCHours() + ':' +
regDate.getUTCMinutes()
;
If you need more functionality than the built-in, I would recommend date-fns.
You'd save the results of your JSON query to a variable data. Then you'd do this:
var countries = "";
for (var i = 0; i < data[0].region.length; i++) {
countries += data[0].region[i];
}
var time = data[0].regDate.split("000Z");

GoogleTagManager do not seem to accept base64 encoded picture

Is it me or GoogleTagManager do not seem to accept base64 encoded pictures?
Exemple with the very basic code below with a very basic image.
I get the following error :
- Type : JavaScript Too Long"
- Description :
"The JavaScript in your Arbitrary HTML tag has too many contiguous non-whitespace characters (e.g. an array literal '[1,2,..]' that is too long). Try inserting spaces between statements to allow compilation (e.g. change '[1,2,...]' to '[1, 2, ...]')."
Is there no way to implement this in GTM, beside putting the js somewhere else than directly into GTM?
Best,
J.
<script type="text/javascript">
var myurl = "http://wwww.toto.com";
var myimg = "data:image/jpeg;base64,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";
$("#beta-ad").empty();
$('<div/>', { id: "1" }).insertBefore($("#beta-ad"));
$("#1").append('<img src="' + myimg + '" style="display:inline; width: auto;" ></img>')
</script>
I think this is by design. But the workaround proposed by #Matus works.
To get around the issue of having to generate JS for a very long base base 64 encoded string I wrote a utility function, splitting the string into chunks of 150 (which GTM accepts), and generating the JS concatenation code.
You can then drop this code into your GTM tag, and reference the base64 variable.
function splitString(string, size, multiline) {
var matchAllToken = (multiline == true) ? '[^]' : '.';
var re = new RegExp(matchAllToken + '{1,' + size + '}', 'g');
var responses = string.match(re);
var value = "var base64='';";
responses.forEach(response => {
value += "base64+='" + response + "';";
});
return value;
}
var base64 = 'eyJ3aWRnZXRfc2.... etc';
var gtmString = splitString(base64, 150, true);
console.log(gtmString);
http://jsfiddle.net/azqpdwxg/2/

Getting NaN Error and undefined Error

I have a Problem with my push function in JavaScript.
<script type="text/javascript">
var myArr = []
var len = myArr.length
$.getJSON('daten.json', function(data) {
$.each(data,function(key,value) {
for(var i = 0; i <= len; i++){
myArr.push("<p>" + value.Name+i ," ", value.Nachname+i + "</p>")
}
})
$('.content').html(myArr.join(''))
})
</script>
I need to convert value.Name+i like this = value.Name0, value.Name1 and so on. I got a JSON File and the Keys are Dynamic, so the first entry got Name0 the second Name1 and so on. Now I must print the JSON file on my html page, but how I can write this line:
myArr.push("<p>" + value.Name+i ," ", value.Nachname+i + "</p>")
with my var i which increment in the loop, to call the Keys in my JSON file?
Like value.Name0. Doing value.Name+i and value.Name.i does not work.
It seems to me what you're looking for is something like this:
myArr.push("<p>" + value['Name'+i] ," ", value['Nachname'+i] + "</p>")
This portion of javascript is covered pretty nicely here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
Take the object property in a variable, use condition to check if it has value or not then concat it
var nameval = value.name;
then use in your javascript variable
nameval+i
You need to convert your i (integer value) to string prior to adding it.
use:
value.Name + i.toString()
here's the jfiddle link: http://jsfiddle.net/kpqmp49o/

How to escape double quotes between JS and JSON

I'm trying to construct a String in JS that can be passed into JSON as an with a very particular format. Desired result is a string of the following form:
["PNG","350x150","127 KB"]
Where PNG correspond to a particular image's type, where 350x150 is the image's dimensions and where 127 KB is the image's size. Each of these threee values are string variables:
var imgType = getImageType(); // Returns "PNG"
var imgDim = getImageDim(); // Returns "350x150"
var imgSize = getImageSize(); // Returns "127 KB"
var imgDescription = '["' + imgType + '","' + imgDim + '","' + imgSize + '"]';
// Sanity check
alert(imgDescription);
iVO.images[thisImage] = {
"fizz":"buzz",
"imgDesc":imgDescription,
"foo":"bar"
}
alert(JSON.stringify(iVO));
The first alert (on the imgDescription variable) prints:
["PNG","350x150","127 KB"]
So far, so good. However, the minute we pass it to the iVO construct and stringify the resultant JSON, it generates the following output (after I pretty print format it):
{
"images":
{
"4490i45"":
{
"fizz":"buzz",
"imgDesc":"[\"PNG\",\"350x150\",\"127 KB\"]",
"foo":"bar"
}
}
}
All of my double quotes (") have been escaped (\")!!! Also, the value for imgDesc is enclosed in double-quotes, which is not what we want (see desired JSON below):
When I send this JSON back to the server its causing the server to choke.
Not sure what is going on here but I've tried several other suggestions, including replacing my double-quotes with '\x22' instances which didn't help.
Any ideas as to what would fix this to get the desired result from JSON.stringify(iVO)? Ultimately that's the only thing that matters, that the we end up sending the following to the server:
{
"images":
{
"4490i45"":
{
"fizz":"buzz",
"imgDesc":["PNG","350x150","127 KB"],
"foo":"bar"
}
}
}
No escaped double-quotes, and the value for imgDesc is not double-quoted. Thanks in advance!
Why don't you just put imgDescription as regular array
var imgDescription = [imgType , imgDim, imgSize];
Stringify should take care of what you are trying to do, otherwise you are passing imgDescription as a string and stringify would escape the quotes.
e.g.
var imgType = "PNG";
var imgDim = "350x150";
var imgSize = "127 KB";
var d = {
"fizz":"buzz",
"imgDesc":[imgType , imgDim, imgSize],
"foo":"bar"
}
console.log(JSON.stringify(d));
Output:
{"fizz":"buzz","imgDesc":["PNG","350x150","127 KB"],"foo":"bar"}

Categories

Resources