Zend_Json ::用双引号编码麻烦

时间:2012-02-14 21:45:08

标签: json zend-framework

我有一个Zend表单,允许您将大学课程添加到数据库中。我收集数据并坚持使用Doctrine 2.数据在表格中的一切都很好。当我检索数据时,一切都准备好了。

array
   0 => &
array
  'id' => int 151
  'className' => string 'Geocaching (Jee-oh-Cash-ing) is part of a worldwide outdoor  game for GPS users. Go on an adventure to find hidden treasure, called “geocaches”. If you own a GPS receiver or a smartphone, bring it (preferred, but not required) along with some fresh batteri' (length=255)
  'instructor' => string 'Geocaching (Jee-oh-Cash-ing) is part of a worldwide outdoor game for GPS users. Go on an adventure to find hidden treasure, called “geocaches”. If you own a GPS receiver or a smartphone, bring it (preferred, but not required) along with some fresh batteri' (length=255)
  'classDescription' => string 'Geocaching (Jee-oh-Cash-ing) is part of a worldwide outdoor game for GPS users. Go on an adventure to find hidden treasure, called “geocaches”. If you own a GPS receiver or a smartphone, bring it (preferred, but not required) along with some fresh batteri' (length=255)

然后我使用Jquery DataTables显示所有表数据。我有一个视图助手,它为数据表呈现jquery。在我正在使用的视图助手

Zend_Json::encode(array_merge($this->_defaultOptions, $options), false,   array('enableJsonExprFinder' => true)); 

具有双引号的所有值都被编码为null。

"aaData":{"id":151,"className":null,"instructor":null,"classDescription":null,}}'

除了具有双引号的任何值之外,任何其他值都将显示在DataTable中。

我必须做一些非常错误的事情,因为当我尝试使用数据重新填充Zend表单进行更新时,我也遇到了这个问题。

$results = $this->_doctrine->getEntityManager()->getRepository('My\Entity')->findOneBy($request->getParam('id'));
$form->setDefaults($results[0]);

如果我从Doctrine转储结果,所有引用的数据都可以使用了。但是在$ form-> setDefaults($ results [0])之后,表单中的字段是空白的。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。解决方案是引号不是“而是”(微软编码的引号)导致json_encode()返回null。用这个答案(How to replace Microsoft-encoded quotes in PHP)替换方法修复了它。

更新:

Zend还有一个为你解析字符串的编码器。但是你需要在引导程序中设置Zend_Json::$userBuiltinEncoderDecoder = true然后它将使用它而不是php的json_encode

答案 1 :(得分:0)

我认为您需要使用常量JSON_HEX_QUOT

这似乎有效:

$options = array(JSON_HEX_QUOT);
$json = Zend_JSON($value, $cyclecheck, $options);

我深入研究了Zend / Json.php代码,看起来如果你想使用JSON_HEX_QUOT,你将不得不使用PHP函数,因为Zend_Json没有传递常量。

    // Encoding
    if (function_exists('json_encode') && self::$useBuiltinEncoderDecoder !== true) {
        $encodedResult = json_encode($valueToEncode);

我认为这是因为ZF编码为PHP 5.2.6标准,$ options被添加到PHP 5.3.0中的json_encode

这是php手册中的参考:

  

示例#2 *一个json_encode()示例,显示了所有选项*

     

<?php $a = array('<foo>',"'bar'",'"baz"','&blong&');

     

echo“Normal:”,json_encode($ a),“\ n”; echo“标签:”,
  json_encode($ a,JSON_HEX_TAG),“\ n”;回声“Apos:”,
  json_encode($ a,JSON_HEX_APOS),“\ n”;回声“Quot:”,
  json_encode($ a,JSON_HEX_QUOT),“\ n”; echo“Amp:”,
  json_encode($ a,JSON_HEX_AMP),“\ n”;回声“全部:”,
  json_encode($ A,JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP)   “\ n \ n” 个;

     

$ b = array();

     

echo“将数组输出为数组:”,json_encode($ b),“\ n”;回声   “将数组输出为对象:”,json_encode($ b,JSON_FORCE_OBJECT),   “\ n \ n” 个;

     

$ c = array(array(1,2,3));

     

echo“非关联数组输出为数组:”,json_encode($ c),“\ n”;   echo“非关联数组输出为对象:”,json_encode($ c,   JSON_FORCE_OBJECT),“\ n \ n”;

     

$ d = array('foo'=&gt;'bar','baz'=&gt;'long');

     

echo“关联数组总是输出为对象:”,json_encode($ d),   “\ n” 个; echo“关联数组总是输出为对象:”,   json_encode($ d,JSON_FORCE_OBJECT),“\ n \ n”;