स्ट्रिंग्स के रूप में PHP json_encode एन्कोडिंग संख्या


142

मुझे PHP json_encode फ़ंक्शन के साथ एक समस्या हो रही है। यह संख्याओं को स्ट्रिंग्स के रूप में एन्कोड करता है, जैसे

array('id' => 3)

हो जाता है

"{ ["id": "3", ...)

जब js इन मानों का सामना करता है, तो यह उनकी व्याख्या करता है क्योंकि स्ट्रिंग्स और न्यूमेरिक ऑपरेशन उन पर विफल होते हैं। क्या किसी json_encodeको स्ट्रिंग्स के रूप में एन्कोडिंग संख्या से रोकने का कोई तरीका पता है ? धन्यवाद!


यह पता चला है कि यह एक संस्करण-विशिष्ट समस्या है। कभी-कभी MySql डेटाबेस से एक पुल सही प्रकार बनाए रखेगा। पुराने संस्करणों में, यह सब कुछ एक स्ट्रिंग के रूप में वापस कर सकता है। मैंने आज सुबह इसके बारे में लिखा था। shakyshane.com/blog/output-json-from-php.html
shane

1
मेरे पास एक ही मुद्दा था और मैं मॉडल में लारवेल के म्यूटर्स का उपयोग करके मुझे हल करने में सक्षम था। यह आपको मॉडल में मूल्यों को संशोधित करने देता है। laravel.com/docs/eloquent#accessors-and-mutators मुझे यह पहली बार में नहीं मिला, लेकिन इस सवाल में मदद मिली: stackoverflow.com/questions/16985656/…
Jazzy

जवाबों:


28

मैंने बहुत जल्दी परीक्षण कर लिया है:

$a = array(
    'id' => 152,
    'another' => 'test',
    'ananother' => 456,
);
$json = json_encode($a);
echo $json;

ऐसा लगता है जैसे आप क्या वर्णन करते हैं, अगर मैं गलत नहीं हूँ?

और मुझे आउटपुट के रूप में मिल रहा है:

{"id":152,"another":"test","ananother":456}

तो, इस मामले में, पूर्णांक स्ट्रिंग में परिवर्तित नहीं हुए हैं।


फिर भी, यह PHP के उस संस्करण पर निर्भर हो सकता है जिसका हम उपयोग कर रहे हैं: PHP के संस्करण के आधार पर, json_encode संबंधित बगों को ठीक किया गया है ...

यह परीक्षण PHP 5.2.6 के साथ किया गया है; मैं PHP 5.2.9 और 5.3.0 के साथ एक ही बात कर रहा हूं; मेरे पास एक और 5.2.x संस्करण नहीं है, जिसके साथ परीक्षण किया जा सकता है :-(

PHP का कौन सा संस्करण आप उपयोग कर रहे हैं? या क्या आपका परीक्षण-मामला आपके द्वारा पोस्ट किए गए उदाहरण से अधिक जटिल है?

शायद http://bugs.php.net/ पर एक बग रिपोर्ट संबंधित हो सकती है? उदाहरण के लिए, बग # 40503: json_encode पूर्णांक रूपांतरण PHP के साथ असंगत है ?


हो सकता है कि बग # 38680 आपको भी रुचा दे, btw?


धन्यवाद मार्टिन। मैं 5.2.9 का उपयोग कर रहा हूं। मुझे आश्चर्य है कि अगर संख्यात्मक डेटा स्ट्रिंग के रूप में DB से पढ़ा जा रहा है? मुझे यकीन है कि फ़ील्ड प्रकार int हैं, लेकिन मैं दूसरे स्पष्टीकरण के बारे में नहीं सोच सकता। मैं अपने सिस्टम पर आपके त्वरित परीक्षण का प्रयास करूंगा और देखूंगा कि क्या मुझे वही परिणाम मिलेगा।
क्रिस बर्नहिल

12
ठीक 5.2.9 के बारे में; अगर आपका डेटा किसी डेटाबेस से आ रहा है, तो समस्या हो सकती है: मैंने अक्सर डेटाबेस से आए डेटा को स्ट्रिंग में डाली गई हर चीज़ के साथ देखा है (मैंने इसे PDO और mssql के साथ देखा है; लेकिन, अगर मुझे सही याद है, तो यह भी होता है; PHP में MySQL के लिए <5.3, जब नया mysqlnd ड्राइवर अभी तक मौजूद नहीं था) ;; यह देखने के लिए कि आपका डेटा कैसा दिखता है, आप var_dump का उपयोग कर सकते हैं, जो डेटा के प्रत्येक भाग के प्रकारों को आउटपुट करता है।
पास्कल मार्टिन

(जारी) सोचता है कि संख्यात्मक मान के लिए डेटा प्रकार स्ट्रिंग है? कोई विचार?
क्रिस बर्नहिल

1
मुझे वास्तव में "क्यों डेटा को MySQL से स्ट्रिंग के रूप में लौटाया गया है" का तकनीकी कारण नहीं पता है ;; शायद कुछ ऐसा जो PHP और MySQL के बीच ड्राइवर के साथ करना है ;; वह कुछ है जो (कुछ मामलों में कम से कम) नए mysqlnd चालक द्वारा सही है जो PHP 5.3 के साथ आता है (देखें blog.ulf-wendel.de/?p=184 ; दिलचस्प खोजने के लिए पृष्ठ में "पूर्णांक" खोजें) वाक्य) ;; लेकिन मैं मानता हूं कि यह अच्छा नहीं है ^ ^
पास्कल मार्टिन

इससे कोई फर्क नहीं पड़ता कि संख्यात्मक डेटा json_encode () द्वारा लौटाया गया है, यह उद्धरण में नहीं है, यह अभी भी एक स्ट्रिंग है। Json_encode () फ़ंक्शन का रिटर्न मान एक स्ट्रिंग है। सभी क्षेत्रों में स्ट्रिंग्स के रूप में लौटने वाले MySQL के बारे में, हाँ, मैंने इसे विशेष रूप से पीडीओ के साथ भी सामना किया है। जिस तरह से मैं इसे देखता हूं आपको हमेशा उन मूल्यों को कास्ट करना चाहिए जिनकी उम्मीद है कि आप PHP में पूर्णांक (या फ्लोट) के लिए संख्यात्मक हैं, यह सुनिश्चित करने के लिए कि MySQL या किसी अन्य डेटाबेस पर सही प्रकार से मान वापस करने के लिए विश्वास न करें।
रिचर्ड नॉप सिप

352

ध्यान दें कि PHP 5.3.3 के बाद से, ऑटो-कन्वर्टिंग नंबरों के लिए एक झंडा है (PHP 5.3.0 में विकल्प पैरामीटर जोड़ा गया था):

$arr = array( 'row_id' => '1', 'name' => 'George' );
echo json_encode( $arr, JSON_NUMERIC_CHECK ); // {"row_id":1,"name":"George"}

4
ध्यान दें कि JSON_NUMERIC_CHECK को PHP 5.3.3 की आवश्यकता है।
राबर्ट

10
जब तक यह एक पूर्णांक को संख्यात्मक लेबल नहीं देता है, तब तक सही काम करता है। IE में .toLowerCase () को उड़ाता है। सावधान रहें, यह समाधान सरल लेकिन अति उत्साही है।
ब्रैड कोच

6
तुम मेरे हीरो हो इसे प्यार करते हो।
पेट्रोगैड

5
इसका कुछ साइड इफ़ेक्ट है अगर आपका स्ट्रिंग नंबर नहीं है लेकिन कंटेंट इस तरह है: 5252788e16597। संदर्भ: Bugs.php.net/bug.php?id=64695
टोनीक्यू

20
JSON_NUMERIC_CHECKयह स्वचालित रूप से अनुमान लगाने का प्रयास करता है कि क्या स्ट्रिंग एक संख्या है या नहीं, इसे पार्स करने की कोशिश कर रहा है। यदि आप इसके बारे में सोचते हैं तो यह बहुत अविश्वसनीय है। यह सभी संख्यात्मक-खोज गुणों को संख्याओं में परिवर्तित करेगा (न केवल वे जो आप चाहते हैं) और यह केवल तभी होगा जब वे संख्याओं की तरह दिखेंगे। असुरक्षित नहीं है तो कम से कम अस्थिर है। कोड जो उत्पादित JSON का उपभोग करता है वह एक या दूसरे प्रकार पर निर्भर हो सकता है। अगर वे अपेक्षाएँ पूरी नहीं हुईं तो अजीब चीजें हो सकती हैं। यदि आप अच्छी प्रथाओं और सुरक्षा के बारे में परवाह करते हैं, तो आपको उन मूल्यों को चुनना चाहिए जो आप चाहते हैं।
वदिम

35

मैं, इसी तरह एक DB (PostgreSQL) से पढ़ रहा था और सब कुछ एक स्ट्रिंग था। हम प्रत्येक पंक्ति पर लूप करते हैं और अपने अंतिम परिणाम सरणी को बनाने के लिए इसके साथ काम करते हैं, इसलिए मैंने उपयोग किया

$result_arr[] = array($db_row['name'], (int)$db_row['count']);

लूप के भीतर इसे पूर्णांक मान के लिए बाध्य करने के लिए। जब मैं json_encode($result_arr)अभी करता हूं , तो यह एक संख्या के रूप में इसे सही ढंग से प्रारूपित करता है। यह आपको यह नियंत्रित करने की अनुमति देता है कि आपके डेटाबेस से आने वाली संख्या क्या है और क्या नहीं है।

संपादित करें:

json_encode()समारोह भी मक्खी के प्रयोग पर ऐसा करने की क्षमता है JSON_NUMERIC_CHECKइसे करने के लिए एक दूसरे तर्क के रूप में झंडा। आपको इसका उपयोग करने में सावधानी बरतने की ज़रूरत है, क्योंकि इस उपयोगकर्ता के उदाहरण में दिखाया गया है (नीचे कॉपी की गई) उदाहरण: http://uk3.php.net/manual/en/function.json-encode.php#106641

<?php
// International phone number
json_encode(array('phone_number' => '+33123456789'), JSON_NUMERIC_CHECK);
?>

और फिर आपको यह JSON मिलता है:

{"phone_number":33123456789}

हां, ऐसा प्रतीत होता है कि समस्या DB एडेप्टर की है जो डेटा प्रकारों की व्याख्या नहीं करती है, json_encodeफ़ंक्शन की नहीं। यह सबसे सही उत्तर है, लेकिन सावधान रहें क्योंकि JSON_NUMERIC_CHECKफोन नंबर और अन्य संख्यात्मक स्ट्रिंग मानों को भी धर्मान्तरित करता है, और यह अग्रणी शून्य या '+' में समस्या दे सकता है ... मैं डीबी रीडिंग फ़ंक्शन में इस समस्या को ठीक करने का सुझाव देता हूं।
कैसरसोल

8

प्रयत्न $arr = array('var1' => 100, 'var2' => 200);
$json = json_encode( $arr, JSON_NUMERIC_CHECK);

लेकिन यह सिर्फ PHP 5.3.3 पर काम करता है। इस PHP json_encode परिवर्तन लॉग को देखें http://php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog


इसने मेरे लिए काम किया। डेबियन निचोड़ पर PHP + अपाचे की डिफ़ॉल्ट स्थापना 6.0.5
पोस्टग्रे

7

मैं एक ही समस्या (PHP-5.2.11 / Windows) का सामना कर रहा हूँ। मैं इस समाधान का उपयोग कर रहा हूँ

$json = preg_replace( "/\"(\d+)\"/", '$1', $json );

जो संख्या के साथ उद्धरण में संलग्न सभी (गैर-नकारात्मक, पूर्णांक) संख्याओं को प्रतिस्थापित करता है ('"42"' '42' बन जाता है)।

PHP मैन्युअल में इस टिप्पणी को भी देखें ।


कोड के लिए धन्यवाद, लेकिन दुख की बात यह है कि यह मेरे काम पर काम नहीं किया क्योंकि मेरे पास एक ऑब्जेक्ट नाम के रूप में एक संख्या है, और यह अमान्य को रेंडर करने के लिए लगता है :(
SSH यह

@SSHThis, शायद आपको इस वाक्यविन्यास का उपयोग सरणी को JSON एन्कोडेड सरणी में परिवर्तित करने के लिए करना चाहिए न कि किसी ऑब्जेक्ट पर। $json_array = json_encode($some_array, false);इसलिए गलत तर्क PHP को ऑब्जेक्ट रूपांतरण न करने के लिए कहता है।
हाइड

उस वर्कअराउंड का उपयोग करना बिल्कुल भी सुरक्षित नहीं है। आपको इस तरह की संरचनाओं के साथ अमान्य जोंस मिलेगा:json_encode(array(-1=>'que', '0'=>'-1'))
एलेक्स यारोशेविच

मुझे दूसरी तरह से एक समस्या थी, मुझे अपने पूर्णांक की जरूरत थी PHP 7.0 में स्ट्रिंग्स के रूप में एन्कोड किया गया और इसका इस्तेमाल किया$this->data = preg_replace("/\" *?: *?(\d+)/", '":"$1"', $this->data);
Maciej Swic

मैं मूल रेगेक्स को बदलकर `'/ / END"(\d+\.?\d*)\"/" `को दशमलव में शामिल करने के लिए, एक और ध्यान दें कि जो लोग JSON_NUMERIC_CHECK का उपयोग करते हैं, वे समस्या का सामना करेंगे जब एक स्ट्रिंग भी सही होगी। वैज्ञानिक संकेतन में संख्या। जैसे, 19E008। JSON_NUMERIC_CHECK इसे 190000 में बदल देगा ...
साहिब खान

3

निम्न परीक्षण इस बात की पुष्टि करता है कि स्ट्रिंग में प्रकार बदलने से json_encode () को JSON स्ट्रिंग (यानी, दोहरे कोट्स से घिरा) के रूप में एक संख्यात्मक लौटना पड़ता है। इसे ठीक करने के लिए सेटपाइप (गिरफ्तारी ["var"], "पूर्णांक") या बसने ($ arr [[var "]," float ") का उपयोग करें।

<?php

class testclass {
    public $foo = 1;
    public $bar = 2;
    public $baz = "Hello, world";
}

$testarr = array( 'foo' => 1, 'bar' => 2, 'baz' => 'Hello, world');

$json_obj_txt = json_encode(new testclass());
$json_arr_txt = json_encode($testarr);

echo "<p>Object encoding:</p><pre>" . $json_obj_txt . "</pre>";
echo "<p>Array encoding:</p><pre>" . $json_arr_txt . "</pre>";

// Both above return ints as ints. Type the int to a string, though, and...
settype($testarr["foo"], "string");
$json_arr_cast_txt = json_encode($testarr);
echo "<p>Array encoding w/ cast:</p><pre>" . $json_arr_cast_txt . "</pre>";

?>

2

पूर्णता के लिए (जैसा कि मैं अभी तक टिप्पणी नहीं जोड़ सकता), मुझे इस विवरण को दूसरे उत्तर के रूप में भी जोड़ने दें:

(संपादित करें: यह महसूस करने के बाद कि स्रोत डेटा (ओपी के मामले में, डेटाबेस परिणाम सेट) को पढ़ने में समस्या हो सकती है (स्ट्रिंग्स के रूप में संख्यात्मक कॉलम लौटाकर), और json_encode () वास्तव में समस्या का स्रोत नहीं था)

" Mysql_fetch_array " दोनों के मैनुअल पृष्ठ :

स्ट्रिंग्स की एक सरणी लौटाता है जो भ्रूण की पंक्ति से मेल खाती है,

... और " mysql_ fetch_ row ":

स्ट्रिंग्स का एक संख्यात्मक सरणी देता है जो भ्रूण की पंक्ति से मेल खाती है

स्पष्ट रूप से कहा गया है कि; लौटे सरणी में प्रविष्टियाँ स्ट्रिंग होगी।

(मैं DB कक्षा का उपयोग phpBB2 में कर रहा था (हाँ मुझे पता है, यह अप्रचलित है!), और उस वर्ग का "sql_fetchrow ()" विधि "mysql_fetch_array ()" का उपयोग करता है

यह महसूस न करते हुए, मैंने इस प्रश्न को खोजना, और समस्या को समझना भी समाप्त कर दिया! :)

जैसा कि पास्कल मार्टिन ने अपनी अनुवर्ती टिप्पणियों में कहा था, मुझे लगता है कि एक ऐसा समाधान है जो स्रोत पर "गलत प्रकार" समस्या का ख्याल रखता है (यानी " mysql_field_type) () फ़ंक्शन का उपयोग करके और फ़ेच के साथ कास्टिंग सही तरीके से कर रहा है (या सामान्य रूप से "लाने" (?) जैसी अन्य प्रचलित पद्धतियाँ बेहतर होंगी।


2

इसलिए पास्कल मार्टिन को यहां पर्याप्त क्रेडिट नहीं मिल रहा है। हर JSON रिटर्न पर संख्यात्मक मानों की जांच करना मौजूदा प्रोजेक्ट के लिए सैकड़ों सर्वर साइड फ़ंक्शन के लिए संभव नहीं है।

मैंने php-mysql को php-mysqlnd से बदल दिया, और समस्या दूर हो गई। संख्याएँ संख्याएँ हैं, तार तार हैं, बूलियन बूलियन हैं।


0

मेरे पास डेटाबेस से डेटा प्रॉसेस करने की समान समस्या थी। मूल रूप से समस्या यह है कि json में कनवर्ट करने के लिए सरणी में प्रकार, PHP द्वारा स्ट्रिंग के रूप में पहचाना जाता है और पूर्णांक के रूप में नहीं। मेरे मामले में मैंने एक क्वेरी बनाई जो DB कॉलम की गिनती की पंक्ति से डेटा लौटाती है। पीडीओ चालक कॉलम को इंट के रूप में नहीं पहचानता है, लेकिन स्ट्रिंग के रूप में। मैंने प्रभावित कॉलम में इंट के रूप में एक कलाकार का प्रदर्शन करके हल किया।


0
$rows = array();
while($r = mysql_fetch_assoc($result)) {
    $r["id"] = intval($r["id"]); 
    $rows[] = $r;
}
print json_encode($rows);  

0

यह समस्या का php संस्करण है, एक ही समस्या थी मेरे php संस्करण को 5.6 में हल करने से समस्या हल हो गई


0

एक इंट या फ्लोट के मानों को कास्टिंग करना इसे ठीक करना प्रतीत होता है। उदाहरण के लिए:

$coordinates => array( 
    (float) $ap->latitude,
    (float) $ap->longitude 
);


-1

बस एक ही समस्या में चला गया और डेटाबेस स्ट्रिंग के रूप में मूल्यों को लौट रहा था।

मैं इसे वर्कअराउंड के रूप में उपयोग करता हूं:

$a = array(
    'id' => $row['id'] * 1,
    'another' => ...,
    'ananother' => ...,
);
$json = json_encode($a);

यह एक संख्या में डालने के लिए मूल्य को 1 से गुणा कर रहा है

आशा है कि किसी की मदद करता है


गुणक का उपयोग करना सबसे कुशल समाधान नहीं है। JSON_UMERIC_CHECK को json_encode पर उपयोग करने पर विचार करें क्योंकि यह स्वचालित रूप से इसे ठीक कर देगा
Erick

-2

json_encode नेटवर्क में भेजने के लिए JSON प्रारूप में कुछ डेटा संरचना को क्रमबद्ध करता है। इसलिए सभी कंटेंट टाइप स्ट्रिंग के होंगे। ऐसे ही जब आप $ _POST या $ _GET से कुछ पैरामीटर प्राप्त करते हैं।

यदि आपको भेजे गए मानों पर संख्यात्मक संचालन करना है, तो बस उन्हें जावास्क्रिप्ट (PHP में या intseInt) (जावास्क्रिप्ट में) के साथ पहले int में बदलें ( और फिर जावास्क्रिप्ट निष्पादित करें)।


यह वह नहीं है जिसके बारे में वह बात कर रहा है। वह संख्याओं के आसपास दोहरे उद्धरण वाले json के बारे में बात कर रहा है।
जेसनवॉफ

JSON के मामले में, यह प्रकारों का संरक्षण करता है। शाब्दिक जावास्क्रिप्ट ऑब्जेक्ट को लिखने की कल्पना करें, किसी भी उद्धृत मूल्य तार बन जाते हैं, लेकिन गैर-उद्धृत संख्या पूर्णांक बन जाती है, 0x [0-9a-z] हेक्स हो जाता है आदि। PHP के साथ प्रकार के अंतर हैं, जैसे कि, ऐसी कोई बात नहीं है। एक साहचर्य सरणी, बस वस्तुओं या अनुक्रमित सरणियों आदि
bucabay

सही। वह जो समस्या रख रहा था, वह यह था कि उसके पास एक php वैरिएबल था, कि उसने सोचा था कि टाइप int है, क्योंकि यह टाइप int के DB कॉलम से आया है। लेकिन वास्तव में PHP चर में स्ट्रिंग था, इस प्रकार JSON में उद्धरण।
जेसनवॉफ

-2

खैर, PHP json_encode () एक स्ट्रिंग लौटाता है।

आप हालांकि js कोड में parseFloat () या parseInt () का उपयोग कर सकते हैं:

parseFloat('122.5'); // returns 122.5
parseInt('22'); // returns 22
parseInt('22.5'); // returns 22

धन्यवाद। मैं उम्मीद कर रहा था कि एक और अधिक सुंदर विधि थी।
क्रिस बरनहिल

1
हाँ, सबसे सुरक्षित तरीका यह है कि उनके ऊपर पार्स किया जाए। लेकिन फिर से, जावास्क्रिप्ट शिथिल टाइप नहीं है?
माउरीस सिप

बस एक टिप्पणी: यह शिथिल टाइप है, फिर भी "1" +1 का परिणाम होगा ... 11 - इसलिए जेएस का उपयोग करना आपको मजबूत प्रकार की भाषाओं की तुलना में अधिक चौकस होना चाहिए, क्योंकि वे आपको चेतावनी देंगे, जेएस बस वही करता है जो वह करता है स्ट्रिंग-नंबरों को संभालने पर सबसे अच्छा लगता है ...
समिस्लमी

हां, लेकिन वह बात नहीं है, json_encode को संख्यात्मक क्षेत्रों में उद्धरण नहीं जोड़ना चाहिए।
andreszs

-3

जैसे oli_arborum ने कहा, मुझे लगता है कि आप preg_replaceकाम करने के लिए उपयोग कर सकते हैं । बस इस तरह कमांड बदलें:

$json = preg_replace('#:"(\d+)"#', ':$1', $json);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.