2014-12-24 2 views
1
  $data = "<QRYRESULT> 
      <ISSUCCESS>Y</ISSUCCESS> 
      <EBLCUSTOMER ACCOUNTNO='11111'> 
      <CUSTACCTNO>121212</CUSTACCTNO> 
      <ACCTSTATUS>active</ACCTSTATUS> 
      <CCYDESC>BDT</CCYDESC> 
      <BALANCE>9999</BALANCE> 
      <AVAILABLEBALANCE>99</AVAILABLEBALANCE> 
      <CUSTOMERNAME>cus_name</CUSTOMERNAME> 
      <AMOUNTONHOLD>1000</AMOUNTONHOLD> 
      <ODLIMIT>99</ODLIMIT> 
      </EBLCUSTOMER> 
      </QRYRESULT>"; 

이것은 변환하려고하는 XML 문자열입니다. 나는 folloung 코드를 사용했다.PHP에서 XML to JSON 변환

  $result = str_replace(array("\n", "\r", "\t"), '', $data); 
      $xml = simplexml_load_string($result); 
      $object = new stdclass(); 
      $object->webservice[] = $xml; 
      $result = json_encode($object); 
      header('content-Type: application/json'); 
      echo $result; 

그리고 다음 json 데이터가 나타납니다.

{ 
    "webservice": [ 
     { 
     "ISSUCCESS": "Y", 
     "CUSTSUMMARY": { 
      "@attributes": { 
       "ACCOUNT": "11111" 
      }, 
      "IDACCOUNT": "1010101", 
      "CODACCTCURR": "BDT", 
      "NUMBALANCE": "99999", 
      "ACCTDESC": "22222", 
      "PRDNAME": "name" 
      } 
     } 
     ] 
    } 

하지만 "@attributes"는 원하지 않습니다. 아래 출력을 원합니다 :

{ 
    "QRYRESULT": { 
    "ISSUCCESS": "Y", 
    "EBLCUSTOMER": { 
    "-ACCOUNTNO": "11111", 
    "CUSTACCTNO": "121212", 
    "ACCTSTATUS": "active", 
    "CCYDESC": "BDT", 
    "BALANCE": "9999", 
    "AVAILABLEBALANCE": "99", 
    "CUSTOMERNAME": "cus_name", 
    "AMOUNTONHOLD": "1000", 
    "ODLIMIT": "99" 
    } 
    } 
    } 

어떻게하면됩니까?

답변

2

"@attributes"필드는 JSON에 인코딩되지 않지만, PHP JSON이 SimpleXMLElement를 직렬화하는 방식의 표준 방법입니다.

변경하고 싶다면 PHP JSON이 객체를 직렬화하는 방법을 변경해야합니다.

class JsonSerializer extends SimpleXmlElement implements JsonSerializable 
{ 
    /** 
    * SimpleXMLElement JSON serialization 
    * 
    * @return null|string 
    * 
    * @link http://php.net/JsonSerializable.jsonSerialize 
    * @see JsonSerializable::jsonSerialize 
    */ 
    function jsonSerialize() 
    { 
     // jishan's SimpleXMLElement JSON serialization ... 

     return $serialized; 
    } 
} 

일예 : 당신이 원하는대로이 자신에 SimpleXMLElementJsonSerializable을 구현하고 JSON 직렬화를 제공함으로써 가능하다 모든 하위 요소와 같은 필드로 속성을 사용하여.

다음과 같이 쉽게 통합 할 수 있습니다. 대신

$xml = simplexml_load_string($result); 

당신은

$xml = simplexml_load_string($result, 'JsonSerializer'); 

하거나

$xml = new JsonSerializer($result); 

와 함수의 나머지 부분은 작동 동일하지만 당신의 소원 직렬화를 사용할 수 있습니다.

예 :

$result = str_replace(array("\n", "\r", "\t"), '', $data); 
$xml = new JsonSerializer($result); 
$object = new stdclass(); 
$object->webservice[] = $xml; 
$result = json_encode($object, JSON_PRETTY_PRINT); 
header('content-Type: application/json'); 
echo $result; 

출력 :

{ 
    "webservice": [ 
     { 
      "EBLCUSTOMER": { 
       "ACCOUNTNO": "11111", 
       "CUSTACCTNO": "121212", 
       "ACCTSTATUS": "active", 
       "CCYDESC": "BDT", 
       "BALANCE": "9999", 
       "AVAILABLEBALANCE": "99", 
       "CUSTOMERNAME": "cus_name", 
       "AMOUNTONHOLD": "1000", 
       "ODLIMIT": "99" 
      } 
     } 
    ] 
} 

위의 예에 대한 직렬화 함수이다 : 여기

function jsonSerialize() 
{ 
    // text node (or mixed node represented as text or self closing tag) 
    if (!count($this)) { 
     return $this[0] == $this 
      ? trim($this) : null ; 
    } 

    // process all child elements and their attributes 
    foreach ($this as $tag => $element) { 
     // attributes first 
     foreach ($element->attributes() as $name => $value) { 
      $array[$tag][$name] = $value; 
     } 
     // child elements second 
     foreach($element as $name => $value) { 
      $array[$tag][$name] = $value; 
     } 
    } 

    return $array; 
} 

일부 메모 :

    ,536,
  • 직렬화에서 자신이 소유 한 요소 유형을 처리해야합니다. 차별화는 자식이없는 단일 요소에 대해 맨 위에 수행됩니다. 속성 처리가 필요한 경우 추가해야합니다.
  • trim($this)은 아마도 $result = str_replace(array("\n", "\r", "\t"), '', $data);으로 잡지 않으려 고합니다. SimpleXMLElement 어떤 경우에도 JSON은 "\r"자로 변환합니다 (SimpleXMLElement은 나누기에 "\n"을 사용함). 또한 whitespace normalization in XML의 규칙에 관심이있을 수 있습니다.
  • 속성이 하위 요소와 이름이 같은 경우 하위 요소로 덮어 씁니다.
  • 같은 이름을 가진 다른 하위 요소 뒤에 오는 하위 요소는 덮어 씁니다.

마지막 두 가지 요점은 예제 코드를 단순하게 유지하는 것입니다. SimpleXMLElement의 표준 PHP JSON 직렬화에 맞춰진 방법은 일련의 블로그 게시물에 나와 있습니다.

정확히이 절차의 기본 및 예시 JsonSerialize 구현은 세 번째 게시물 SimpleXML and JSON Encode in PHP – Part III and End에서 사용할 수 있습니다.

또 다른 관련 질문은

+0

은 내가 내 컨트롤러 클래스의 jsonSerialize() 함수를 작성하고 함수에서 호출 않았다 어떤 프레임 워크를 CodeIgniter를 사용하고 있습니다로하는 전 $ xml = $ this-> jsonSerialize();와 같은 json 변환에 대한 XML 작업 그런 다음 내 코드는 남지만 다음과 같은 오류가 발생합니다. '심각한 오류 : 정의되지 않은 메소드 호출 CI_Benchmark :: attributes() @hakre – Ishrak

+0

Codeigniter없이 먼저 실행하여 작동 여부를 확인할 수 있도록하십시오. 클래스 이름 ** CI_Benchmark **는 현재 Codeigniter와 혼용되어 오도 된 것을 나타낼 수 있습니다. – hakre