2016-10-26 11 views
1

これは私がやっているものの例である:JSON.stringify出力に倍数としてフォーマットされた整数を挿入できますか?

 

var serialized = JSON.stringify({x: 1.0}); 
 

そして、これは私が望む結果である:

 

{"x": 1.0} 
 

しかし、これは私が取得していた結果である:

 

{"x": 1} 
 

私はJSON.stringifyの第2引数を使ってみました:

 

JSON.stringify({x: 1.0}, function (k, v) { 
    if (Number.isInteger(v)) { 
    return v.toFixed(1); 
    } 
    return v; 
}); 
 

しかし、それは私はどちらか欲しいものを私に取得していません:

JSON.stringifyため the documentationを見ると
 

{"x": "1.0"} 
 

、私はこれは私がやりたいことを得るために明白な方法が表示されません。回避策や欠けているものはありますか?

コンテキストの場合、シリアル化されたデータを取得してelasticsearchクラスターに渡しますが、elasticsearchにxフィールド(この例では)のマッピングを動的に作成します。しかし、elasticsearchが最初に見た数値が1で、1.0でない場合は、ダブルマッピングの代わりに長いマッピングが作成され、xのdouble値(たとえば、1.5)であれば、elasticsearch解析が失敗します。

+0

短い答え。 '1'を' 1.0'にすることはできず、それを数値として保持することはできません。 '1.0'は' 1'です - 文字列でない限り、常に最小の数字に変換されます。それが弾性検索を設定する最初のインスタンスであれば、ダミーオブジェクトを 'x:1.1'でプッシュすると、すべてのプロパティ名がどのようなものになるかを事前に知っていれば – tymeJV

+0

@ tymeJVを取得します(例えば' x '、' y'、 'z'など)、正しいタイプのマッピングを作成することはできますが、ドキュメントはログメッセージなので、作成しません。 私自身の 'stringify'関数を書いても、私が望むものを得ることはできましたが、' JSON.stringify'を使って私が望むものを得る方法があるのだろうかと思います私自身を転がす必要があります。 –

+0

これはビュー固有の要件であるようですので、AngularJSのAngular 2/Filtersに相当するものを使用することを検討してください。 –

答えて

0

1.01はjavascriptで同等ですが、言語にはint/double/longというものはありません。その代わりに、タイプデータを追加して、結果を期待しているタイプを完全に明確にする必要があります。 JSON.stringifyと文字列#の代替機能を使用して交換するという考えと交換する整数を見つけるための数値の小さい付加を取る

{"x": {"type": "double", "value": 1}} 
+0

これは本当に私を助けません。私はJavaScriptで '1.0'と' 1'が同等であることを知っています。これは、JSON.stringifyと同じようにJavaScriptについての質問ではなく、私が望むように操作できるかどうか(例えば、 '1.0'を二重引用符で囲まずに文字列を返すなど)です。 –

+1

なぜそれをしたいですか?これらはすべてのJSONプロセッサと意味的に同じです。 '1'の代わりに' 1.0'を使いたい理由はありません。 –

+1

@StevenOxleyだから何をすることができますか?それに 'JSON.parse'を呼び出しますか?それは '1.0'を' 1'に変えます。今度は 'JSON.parse'を' 1.0'に解析するようにしましょう。 「1.0」は「1」に相当します。これの方法はありません。 (これはどのJSONパーサーでも同じですが、わかりやすくするためにJSON.parseを使用していますが、Javaのパーサーでも同様です) – tcooc

2

それは次のようになります。いいえ、

var s = JSON.stringify({ x: 1.0 }, function (k, v) { 
 
     if (Number.isInteger(v)) { 
 
      return v + 1e-10; 
 
     } 
 
     return v; 
 
    }).replace(/\.0000000001/, '.0'); 
 

 
console.log(s);

+1

これは、醜い、ハッキー、賢い、おそらくかなり合理的な回避策を検討しています。 –

+0

これは私がこの問題で見つけた最良の解決策ですが、 '0.0'の代わりに' 1e-10'と書いてあるので、2番目の文字列を置き換えました。そして、置換のために 'g' - グローバルフラグを追加する必要があります。 – Pawel

+0

@Pawelそれから '1e-9'のように大きな数字を入力してください –

関連する問題