JavaScript(またはjQuery)を使用して、オブジェクトを記述する文字列をJSON文字列に変換する方法を教えてください。
例:これを変換します( _ not _ 有効なJSON文字列):
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
これに:
str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
できればeval()
を使わないようにしたいと思います。
文字列が信頼できるソースからのものである場合、eval
を使用してからJSON.stringify
を使用できます。このような:
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var json = JSON.stringify(eval("(" + str + ")"));
オブジェクトリテラルをeval
する場合は、括弧で囲む必要があります。そうでない場合、ブレースはオブジェクトではなくブロックとして解析されます。
私はまた、有効なJSONでオブジェクトをエンコードし、解析し、エンコードし、おそらくおそらく解析する必要がないようにすることははるかに良いという質問の下でのコメントに同意します再び。 HTMLは単一引用符で囲まれた属性をサポートしています(文字列内の単一引用符は必ずHTMLエンコードしてください)。
あなたの文字列は有効なJSONではないので、JSON.parse
(またはjQueryの$.parseJSON
)は機能しません。
1つの方法は、eval
を使用して「無効な」JSONを「解析」し、それをstringify
して有効なJSONに「変換」することです。
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
str = JSON.stringify(eval('('+str+')'));
無効なJSONを「修正」する代わりに、まず有効なJSONから始めることをお勧めします。 str
はどのように生成されますか?生成される前ではなく、そこでそこで修正されるべきです。
_ edit _ :この文字列はデータ属性に格納されています(コメントで)。
<div data-object="{hello:'world'}"></div>
ここで修正することをお勧めします。したがって、JSON.parse
dにすることもできます。まず、キーと値の両方を二重引用符で囲む必要があります。次のようになります(HTML内の一重引用符付き属性が有効)。
<div data-object='{"hello":"world"}'></div>
さて、あなたはJSON.parse
(あるいはjQueryの$.parseJSON
)を使うことができます。
var str = '{"hello":"world"}';
var obj = JSON.parse(str);
下のリンクに簡単なコードを使用してください。
http://msdn.Microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx
var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);
そして逆に
var str = JSON.stringify(arr);
この小さな関数が無効なJSON文字列を有効なものに変換することを願っています。
function JSONize(str) {
return str
// wrap keys without quote with valid double quote
.replace(/([\$\w]+)\s*:/g, function(_, $1){return '"'+$1+'":'})
// replacing single quote wrapped ones to double quote
.replace(/'([^']+)'/g, function(_, $1){return '"'+$1+'"'})
}
結果
var invalidJSON = "{ hello: 'world',foo:1, bar : '2', foo1: 1, _bar : 2, $2: 3, 'xxx': 5, \"fuz\": 4, places: ['Africa', 'America', 'Asia', 'Australia'] }"
JSON.parse(invalidJSON)
//Result: Uncaught SyntaxError: Unexpected token h VM1058:2
JSON.parse(JSONize(invalidJSON))
//Result: Object {hello: "world", foo: 1, bar: "2", foo1: 1, _bar: 2…}
注意して使用してください(eval()
のため)。
function strToJson(str) {
eval("var x = " + str + ";");
return JSON.stringify(x);
}
として呼び出します。
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
alert( strToJson(str) );
私はこの古いスレッドに興味がある人のために私の答えを入れました。
私はeval()
を使わずに不正なJSON文字列をJavaScriptオブジェクトに変換する HTML5 data- * parser をjQueryプラグインと demo 用に作成しました。
以下のHTML5のdata- *属性を渡すことができます。
<div data-object='{"hello":"world"}'></div>
<div data-object="{hello:'world'}"></div>
<div data-object="hello:world"></div>
オブジェクトに:
{
hello: "world"
}
免責事項:自宅で、または真剣にあなたを連れて行く他の開発者を必要とするもののためにこれを試してはいけません:
JSON.stringify(eval('(' + str + ')'));
私はそれをしました。
そうしないでください、evalはあなたにとって悪いことです。上記のように、古いブラウザ(IE7以下)にはCrockfordのJSONシムを使用してください。
このメソッドでは、文字列が有効な javascript である必要があります。これは、JSONにシリアル化できるjavascriptオブジェクトに変換されます。
編集: /ロケットが示唆するように修正。
Douglas Crockfordにはコンバーターがありますが、悪いJSONから良いJSONに役立つかどうかはわかりません。
あなたの最善かつ最も安全な策は JSON5 - JSON for Humans でしょう。そのユースケース専用に作成されています。
const result = JSON5.parse("{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }");
console.log(JSON.stringify(result));
<script src="https://cdnjs.cloudflare.com/ajax/libs/json5/0.5.1/json5.min.js"></script>
丸括弧を記述しなければならないのは、eval
は中括弧の内側のコードをコマンドのブロックと見なすからです。
var i = eval("({ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] })");
この偉業を達成するためのもっと簡単な方法があります。ただダミー要素のonclick属性をハイジャックして、あなたの文字列をJavaScriptオブジェクトとして強制的に返すようにするだけです:
var jsonify = (function(div){
return function(json){
div.setAttribute('onclick', 'this.__json__ = ' + json);
div.click();
return div.__json__;
}
})(document.createElement('div'));
// Let's say you had a string like '{ one: 1 }' (malformed, a key without quotes)
// jsonify('{ one: 1 }') will output a good ol' JS object ;)
これがデモです: http://codepen.io/csuwldcat/pen/dfzsu (コンソールを開いてください)
たぶんあなたはこれを試してみる必要があります:
str = jQuery.parseJSON(str)
ちょっと変わったのはbabel-standalone
であなたの文字列を変換できることです。
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
function toJSON() {
return {
visitor: {
Identifier(path) {
path.node.name = '"' + path.node.name + '"'
},
StringLiteral(path) {
delete path.node.extra
}
}
}
}
Babel.registerPlugin('toJSON', toJSON);
var parsed = Babel.transform('(' + str + ')', {
plugins: ['toJSON']
});
var json = parsed.code.slice(1, -2)
console.log(JSON.parse(json))
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
上記の単純な例では、2つの単純な正規表現を置き換えてこれを行うことができます。
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
str.replace(/(\w+):/g, '"$1":').replace(/'/g, '"');
=> '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
大きな警告 :この単純な方法では、オブジェクトに'
または:
文字を含む文字列がないことを前提としています。たとえば、eval
を使用せずに次のオブジェクト文字列をJSONに変換する良い方法は考えられません。
"{ hello: 'world', places: [\"America: The Progressive's Nightmare\"] }"
var str = "{こんにちは: '世界'、場所:['アフリカ'、 'アメリカ'、 'アジア'、 'オーストラリア']}" var fStr = str .replace(/([Az] *)(:)/ g、 '"$ 1":').replace(/ '/ g、 "\" ")
console.log(JSON.parse(fStr))
すみません、私は私の電話にいます、これは写真です。
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var json = JSON.stringify(eval("(" + str + ")"));
1つの正規表現を使用し、evalを使用しない解決策:
str.replace(/([\s\S]*?)(')(.+?)(')([\s\S]*?)/g, "$1\"$3\"$5")
これは、複数の行と、ダブルクォート "string"で置き換えられたシングルクォート 'string'のすべての可能性のあるオカレンス(/ gフラグ)に対して機能するはずだと私は信じています。