2013-08-14 2 views
8

Поэтому я хочу, чтобы создать этот объект JSON:Создание JSON из строки, чтобы использовать в качестве объекта

{ 
    "id":"3", 
    "created":"0000-00-00", 
    "parentIDs":null, 
    "childIDs":"", 
    "uid":"movies", 
    "title":"Movies", 
    "related":"movies", 
    "pos":"", 
    "css":"{ "background-image":"-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%)" }" 
} 

из строки:

value = ""id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":""" 

Эта строка поступает из базы данных, так что я не могу действительно измените форматирование, но оно должно быть правильным.

(Эта строка происходит из массива строк похожи, что я перебирать, как-то потери {} вокруг них)

Я попытался удалить внешние кавычки с value.substr(1, value.length - 2);. И затем конвертируйте его с .toJSON();, но он добавляет только лишние косые черты, которые мне не нужны.

Мне просто нужно добавить {} вокруг него, а затем javascript увидит его как объект JSON.

Есть ли какой-либо сокращенный способ сделать это? или есть небольшая библиотека, которая может превратить мою грязную строку умным способом в объект JSON?

[update] 

Я пробовал: eval('{' + value + '}'); Но я получаю Uncaught SyntaxError: Unexpected token : в Chrome.

Я попробовал JSON.parse, но получил: TypeError: JSON.parse is not a function в Chrome и Firefox, это должно быть форматирование строки. Я начинаю подозревать запись «css», хотя она начинает жаловаться на первую запись «id», она ожидает функцию вместо JSON?

(я срубил сырец JSON, но забыл самое важное "CSS" один)

[Update2]

Ok, поэтому я изменил данные CSS в ' вместо ", теперь он будет на самом деле разобрать, но теперь мой скрипт сломан, потому что я ожидаю, что исходный CSS из db, каким-либо образом изменить полученный 'css':'blabla' на: "css":"blabla"?

+2

Нет такой вещи, как объект JSON. Есть строки JSON и объекты JavaScript; какой из двух вы хотите получить? Кроме того, вы уверены, что нет лучшего способа? «Я повторяю» говорит мне, что это ваш код, который производит это, поэтому другие варианты должны быть доступны. – Jon

+0

* «Мне просто нужно добавить {} вокруг него, а затем javascript увидит его как объект JSON». * Нет. Если вы добавите '{' и '}' в начале и конце, тогда у вас может быть строка содержащий действительный JSON (а не объект). Но это то, чего ты хочешь, верно? Если вы хотите использовать объект JavaScript, вам нужно передать новую строку в 'JSON.parse'. Я думаю, вам стоит взглянуть на http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/, чтобы лучше понять различия между объектами JSON и JavaScript , –

+0

В принципе, я хочу иметь полезный объект, к которому я могу получить доступ через value.id, например, который я не могу сделать, когда это строка. – TrySpace

ответ

14

Если у вас есть строка, содержащая действительный JSON, вы можете преобразовать ее в объект JavaScript с помощью JSON.parse().

Предполагая, что вы есть строка:

value = '"id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":""'; 

вы бы тогда сделать:

obj = JSON.parse("{"+value+"}");JSON 

Примечание она нуждается в {} как часть строки, чтобы быть действительной строкой JSON.

+0

Пробовал это, но получить «TypeError: JSON.parse не является функцией» каждый раз .. Наверное, потому что это неверно JSON – TrySpace

+1

Какой браузер вы используете? JSON.parse доступен практически в каждом текущем браузере - http://caniuse.com/json – knolleary

+1

@TrySpace: Нет, это не имеет никакого отношения к этому. Ваш браузер просто не реализует эту функцию. Вы можете включить json3 в этом случае: https://github.com/bestiejs/json3. –

0

Что вы ищете является JSON.parse:

var str = '{"id":"3", 
"created":"0000-00-00", 
"parentIDs":null, 
"childIDs":"", 
"uid":"movies", 
"title":"Movies", 
"related":"movies", 
"pos":""}', 
    foo = JSON.parse(str); 

Это, безусловно, может выглядеть чище, хотя.

+0

Строка недействительна JSON. –

+0

@FelixKling О себе? – federicot

+1

Лучше, но это не то, что имеет OP. Вероятно, вам придется объяснить, как преобразовать строку OP в строку, содержащую действительный JSON. –

2

Вот немного обходного пути, если вы говорите, почему ваша строка не разбирается, потому что следующее измерение вашего массива JSON завернуто в кавычки. Я уверен, что есть лучший способ.

var value = '"id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"","css":"{ "background-image":"-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%)" }"'; 

value = value.replace("\"{", "{"); 
value = value.replace("}\"", "}"); 

value = "{"+value+"}"; 
value = JSON.parse(value); 

console.log(value); 

А вот мой fiddle

6

нормально, так что это лучшее, что я мог придумать:

var value = '"id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"","css":"{ "background-image":"-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%)" }"'; 
var nestedObjects = []; 
String.prototype.trimQuotes = function() { 
    return this.indexOf('"') === this.lastIndexOf('"') ? this.substring(this.indexOf('"') + 1) : this.substring(this.indexOf('"') + 1, this.lastIndexOf('"')); 
}; 
function convertObject(str) { 
    var retObj = {}; 
    $.each(str.split(','), function() { 
     var keypair = this.split(':'); 
     if (keypair.length < 2) { return; } 
     retObj[keypair[0].trimQuotes().trim()] = keypair[1].indexOf('@') > -1 ? nestedObjects[parseInt(keypair[1].trimQuotes().substring(1), 10)].trimQuotes().trim() : keypair[1].trimQuotes(); 
    }); 
    return retObj; 
} 
var temp = value.split('{')[0]; 
$.each(value.split('{'), function (i, t) { 
    if (i === 0) { 
     return; 
    } 
    var splits = t.split('}'); 
    nestedObjects.push(splits[0]); 
    temp += '@' + (i - 1); 
    if (splits.length > 1) { 
     temp += splits[1]; 
    } 
}); 

http://jsfiddle.net/SkCVd/5/

+0

+1 Это работает, кажется, немного переработано, но оно работает. – Reimius

3

здесь анализатор с использованием regx!

var tmp = '"id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"","css":"{ "background-image":"-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%)" }"' ; 
var reg = /"(\w+)":(?:"([\w-]*)"|"{([^}]*)}"|(null))/g; 
var obj ={}; 
tmp.replace(reg,function(text,all,dall,hall,vall){ 
    obj[all]=hall||dall||vall; 
    console.log(all +":"+obj[all]); 
}); 

его довольно простой не так ли?

4

Это опция inbuild в jquery для разбора строки в Json.

в

var str = '{ "id":"3", "created":"0000-00-00", "parentIDs":null, "childIDs":"", "uid":"movies", "title":"Movies", "related":"movies", "pos":"", "css":"{ background-image:-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%) }"}'; 
    $(document).ready(function() { 

     var result = jQuery.parseJSON(str); 
     console.log(result); 
    }); 

удалены " из CSS части
Вот выход enter image description here см ниже URL http://api.jquery.com/jQuery.parseJSON/

0

Как об этом

var arr = new Function('return {' + value + '}')(); 

Это безопаснее и быстрее эквивалент eval и JSON.parse для вашего требования.

2

Как все уже упомянуты jQuery.parseJSON() - путь. В вашем случае вам необходимо очистить строку, которую вы получаете от SQL первых, в противном случае вы не сможете разобрать в правильном формате JSON:

// format from SQL : value = "validJSON" 
var fromSQL = 'value = ""id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"""'; 

// we need to remove @value ="' at the beginnig and '"' at the end 
var withoutWrapper = fromSQL.substring(('value = "').length, fromSQL.length-1); 

// now add {} to make it as a json obj 
var withNewWrapper = '{' +withoutWrapper +'}'; 

// parse it 
var json= jQuery.parseJSON(withNewWrapper); 

Вот функциональный пример: http://jsfiddle.net/vojtiik/pzJTa/

Такие инструменты, как это JsonViewer всегда помогает!

0

Как я понимаю, вы не получаете эту строку с помощью AJAX, но встраиваете ее непосредственно в какой-либо скрипт на стороне сервера, поэтому нет необходимости разбирать ее на клиенте (JSON.parse здесь не нужен). Все, что вам нужно правильно писать данные объекта согласно правилам JSON:

var data_object = { 
"id":"3", 
    "created":"0000-00-00", 
    "parentIDs":null, 
    "childIDs":"", 
    "uid":"movies", 
    "title":"Movies", 
    "related":"movies", 
    "pos":"", 
    "css":'{ "background-image":"-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%)" }' 

} 

Обратите внимание на CSS свойство (если вы хотите включить кавычки в строке, вы можете просто использовать различные кавычки для маркировки начала и конца строки). Другого пути нет - вам просто нужно правильно указать свои строковые константы.

Смежные вопросы