Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 自定义json_解码行为_Php_Xml_Json - Fatal编程技术网

Php 自定义json_解码行为

Php 自定义json_解码行为,php,xml,json,Php,Xml,Json,我有一个REST API返回的JSON字符串,如下所示: '{"success":true,"product":{"id":"2","category_id":"2","type":"9","name":".ch","description":"","visible":"1","domain_options":"0","stock":"0","qty":"0","autosetup":"2","subdomain":"","owndomain":"0","tax":"0","upgrades":

我有一个REST API返回的JSON字符串,如下所示:

'{"success":true,"product":{"id":"2","category_id":"2","type":"9","name":".ch","description":"","visible":"1","domain_options":"0","stock":"0","qty":"0","autosetup":"2","subdomain":"","owndomain":"0","tax":"0","upgrades":"","sort_order":"0","client_limit":"0","rel":"Product","paytype":"DomainRegular","m_setup":"0.00","q_setup":"0.00","s_setup":"0.00","a_setup":"0.00","b_setup":"0.00","t_setup":"0.00","p4_setup":"0.00","p5_setup":"0.00","d_setup":"0.00","w_setup":"0.00","h_setup":"0.00","m":"0.00","q":"0.00","s":"0.00","a":"0.00","b":"0.00","t":"0.00","p4":"0.00","p5":"0.00","d":"0.00","w":"0.00","h":"0.00","ptype":"DomainsType","options":"3","module":"13","server":"","tlds":null,"periods":{"1":{"product_id":"2","period":"1","register":"17.00","transfer":"17.00","renew":"17.00"}},"tag_name":".ch","tag_description":"","free_domain":"0","product_id":"2","not_renew":"0","epp":true,"ns":["ns3.dfinet.ch","ns4.dfinet.ch","",""],"nsips":"|||","tld":".ch","nsip":["","","",""],"asciimode":true,"app_id":"1","app_ns1":"","app_ns2":"","app_ns3":"","app_ns4":"","app_ip1":"","app_ip2":"","app_ip3":"","app_ip4":"","emails":{"AfterRegistrarRegistration":"28","AfterRegistrarRenewal":"29","AfterRegistrarTransfer":"30","expiringDomain":"54"}},"config":false,"call":"getProductDetails","server_time":1412061849}'
我试图将其转换为一个对象,然后为soap Web服务提供一个XML,到目前为止我所做的是

  • 从RESTAPI中检索结果->使用json解码($obj)将其转换为对象
  • 为转换后的对象提供soap句柄()
问题是,对于以下JSON,有些属性是“数字”的,但不是顺序的,因此JSON将字符串转换为对象,如下所示:

$o = new stdClass();
$o->1 = 'a string';
问题在于,当soap将对象转换为XML时,名为的节点是无效的XML标记

如何“预解析”JSON并将所有这些伪对象转换为序列数组

编辑:基于dmikam答案的解决方案

我根据建议的解决方案做了一些更干净的事情:

function fixVariables($variables)
{
    if (!is_array($variables) && !is_object($variables)) {
        return $variables;
    }

    foreach ($variables as $k => &$variable) {

        if (is_object($variable)) {

            if (is_numeric(key($variable))) {
                $values = array();
                foreach ($variable as $value) {
                    $values[] = $value;
                }
                $variable = $values;
                unset($values);
            }
            $this->fixVariables($variable);

        } elseif (is_array($variable)) {

            if (is_numeric(key($variable))) {
                $variable = array_values($variable);
            }
            $this->fixVariables($variable);
        }
    }

    return $variables;
}

嗯,我认为您可以遍历得到的解析对象,并将包含数字索引的所有项转换为数组。函数应该是这样的:

function fixJsonObject($obj){
    if (is_object($obj)){
        foreach(get_object_vars($obj) as $key=>$value){
            $obj->$key = fixJsonObject($obj->$key);
            if (is_numeric($key)){
                return (array)$obj;
            }
        }
    }elseif (is_array($obj)){
        foreach($obj as $key=>$value){
            $obj[$key] = fixJsonObject($obj[$key]);
        }
    }
    return $obj;        
}

$json = json_decode('{your: "json"}');
$json = fixJsonObject($json);

我对它进行了一点测试,看起来它可以工作。

在您的json示例中,没有数字索引。请提供一些使用它们的示例,这些示例被错误地转换。这里有一个数字索引:“periods”:{“1”:{,该行为是正确的,因为此json的对象表示形式是一个具有属性{1}的对象,但我想做的是将其转换为“具有数字键的对象”到顺序排列OK,现在我明白了。我在下面发布了解决方案。是的,我最终得到了相同的解决方案,我认为有更干净的方法可以做到这一点,但我想这是我唯一能做的事情