web-dev-qa-db-ja.com

オブジェクト文字列をJSONに変換する

JavaScript(またはjQuery)を使用して、オブジェクトを記述する文字列をJSON文字列に変換する方法を教えてください。

例:これを変換します( _ not _ 有効なJSON文字列):

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"

これに:

str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'

できればeval()を使わないようにしたいと思います。

155
snorpey

文字列が信頼できるソースからのものである場合evalを使用してからJSON.stringifyを使用できます。このような:

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var json = JSON.stringify(eval("(" + str + ")"));

オブジェクトリテラルをevalする場合は、括弧で囲む必要があります。そうでない場合、ブレースはオブジェクトではなくブロックとして解析されます。

私はまた、有効なJSONでオブジェクトをエンコードし、解析し、エンコードし、おそらくおそらく解析する必要がないようにすることははるかに良いという質問の下でのコメントに同意します再び。 HTMLは単一引用符で囲まれた属性をサポートしています(文字列内の単一引用符は必ずHTMLエンコードしてください)。

176
Matthew Crumley

あなたの文字列は有効な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.parsedにすることもできます。まず、キーと値の両方を二重引用符で囲む必要があります。次のようになります(HTML内の一重引用符付き属性が有効)。

<div data-object='{"hello":"world"}'></div>

さて、あなたはJSON.parse(あるいはjQueryの$.parseJSON)を使うことができます。

var str = '{"hello":"world"}';
var obj = JSON.parse(str);
108
Rocket Hazmat

jQuery.parseJSON

str = jQuery.parseJSON(str)

編集します。これは有効なJSON文字列がある場合に提供されます。

49
Farmor

下のリンクに簡単なコードを使用してください。

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);
39
Ronald

この小さな関数が無効な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…}
22
allenhwkim

注意して使用してください(eval()のため)。

function strToJson(str) {
  eval("var x = " + str + ";");
  return JSON.stringify(x);
}

として呼び出します。

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
alert( strToJson(str) );
9
Tomalak

私はこの古いスレッドに興味がある人のために私の答えを入れました。

私は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"
}
4
tokkonopapa

免責事項:自宅で、または真剣にあなたを連れて行く他の開発者を必要とするもののためにこれを試してはいけません:

JSON.stringify(eval('(' + str + ')'));

私はそれをしました。
そうしないでください、evalはあなたにとって悪いことです。上記のように、古いブラウザ(IE7以下)にはCrockfordのJSONシムを使用してください。

このメソッドでは、文字列が有効な javascript である必要があります。これは、JSONにシリアル化できるjavascriptオブジェクトに変換されます。

編集: /ロケットが示唆するように修正。

4
gonchuki

Douglas Crockfordにはコンバーターがありますが、悪いJSONから良いJSONに役立つかどうかはわかりません。

https://github.com/douglascrockford/JSON-js

2
Seth

結果には "eval"、次にJSON.stringify、次にJSON.parseを使用する必要があります。

 var errorString= "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
 var jsonValidString = JSON.stringify(eval("(" + errorString+ ")"));
 var JSONObj=JSON.parse(jsonValidString);

enter image description here

2
Negi Rox

あなたの最善かつ最も安全な策は 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>
1
dereli

丸括弧を記述しなければならないのは、evalは中括弧の内側のコードをコマンドのブロックと見なすからです。

var i = eval("({ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] })");
1
kuboslav

この偉業を達成するためのもっと簡単な方法があります。ただダミー要素の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 (コンソールを開いてください)

1
csuwldcat

たぶんあなたはこれを試してみる必要があります:

str = jQuery.parseJSON(str)
0
howdyhyber

ちょっと変わったのは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>
0
Moritz Roessler

上記の単純な例では、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\"] }"
0
Topher Hunt

var str = "{こんにちは: '世界'、場所:['アフリカ'、 'アメリカ'、 'アジア'、 'オーストラリア']}" var fStr = str .replace(/([Az] *)(:)/ g、 '"$ 1":').replace(/ '/ g、 "\" ")

console.log(JSON.parse(fStr))enter image description here

すみません、私は私の電話にいます、これは写真です。

0
Francis Leigh
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var json = JSON.stringify(eval("(" + str + ")"));
0
praveenkumar

1つの正規表現を使用し、evalを使用しない解決策:

str.replace(/([\s\S]*?)(')(.+?)(')([\s\S]*?)/g, "$1\"$3\"$5")

これは、複数の行と、ダブルクォート "string"で置き換えられたシングルクォート 'string'のすべての可能性のあるオカレンス(/ gフラグ)に対して機能するはずだと私は信じています。

0
Chaitanya P

New Function()を使用することはevalよりも優れていますが、それでも安全な入力でのみ使用されるべきです。

const parseJSON = obj => Function('"use strict";return (' + obj + ')')();

console.log(parseJSON("{a:(4-1), b:function(){}, c:new Date()}"))
// outputs: Object { a: 3, b: b(), c: Date 2019-06-05T09:55:11.777Z }

出典: _ mdn _2ality

0
SamGoody