2011-02-08 4 views
1

org.json을 사용하여 큰 xml을 json 문자열로 변환합니다. 그러나 그것은 숫자 0에 대해 문자열 "0"을 생성하는 반면, 5 또는 2와 같은 다른 숫자는 잘 작동하고 실수가되는 것처럼 보입니다.json.org 0은 숫자가 아닌 문자열로 저장됩니다.

XML :

<w count="2" winline="5" freespins="0" jackpot="false" start="0" payout="500" supergames="0" /> 

자바 :

JSONObject json = XML.toJSONObject(xml); 
String jsontext = json.toString(); 

결과 JSON :

"w":[{"supergames":"0","freespins":"0","winline":5,"count":2,"start":"0","jackpot":false,"payout":500} 

0이 될 실제 0 숫자 대신 문자열로 만들 수있는 방법이있다?

+1

XML 속성에는 문자열 유형이 있습니다. XML은 문자열을 반환하고 JSON은 문자열을 그대로 유지합니다. – kirilloid

+1

@kirilloid : 그렇다면 0 이외의 숫자는 왜 작동합니까? – clamp

+0

FWIW : github에 json을 포크하고 버그를 수정했습니다 : https://github.com/matthiasgrumet/JSON-java – clamp

답변

3

버그처럼 보입니다. 나는 소스를 보았고, 그것은 기본적 숫자로 실패한 변환의 결과로 IndexOutOfBoundsException, 던질 수 있습니다 것 같습니다 :

https://github.com/douglascrockford/JSON-java/blob/master/XML.java (라인 327) : 문자열 "0"로 시작하면

if (initial == '0' && string.charAt(negative ? 2 : 1) == '0') { 

예외 문자열이 1 인 경우, 즉 문자열이 "0"인 경우. 예외가 발견되면 변환 방법은 기본적으로 원래 문자열 ("0")을 다시 변환하지 않습니다.

하지 많은 옵션 :

  1. 보고서 빠른 수정에 대한 버그와 희망.
  2. 현재 자신의 파일 사본에서 직접 수정하십시오.
  3. 0 대신 0.0을 사용할 수있는 경우 XML의 "0"을 "0.0"으로 변경하십시오. (credit @bestsss)
+1

0.0 – bestsss

+1

감사를 사용할 수 있습니다. 문제를 신고했습니다. – clamp

+1

@bestsss : 예, 할 수는 있지만 실제로는 그러지 않습니다. 차라리 버그를 고치겠습니다. – clamp

3

여기 XML 속성을 JSON 값으로 변환하는 snippet of code입니다.

내가 틀릴 수도 있지만 값이 "0"인 경우는 처리되지 않습니다.

try { 
      char initial = string.charAt(0); 
      boolean negative = false; 
      if (initial == '-') { 
       initial = string.charAt(1); 
       negative = true; 
      } 
      if (initial == '0' && string.charAt(negative ? 2 : 1) == '0') { 
       return string; 
      } 
      if ((initial >= '0' && initial <= '9')) { 
       if (string.indexOf('.') >= 0) { 
        return Double.valueOf(string); 
       } else if (string.indexOf('e') < 0 && string.indexOf('E') < 0) { 
        Long myLong = new Long(string); 
        if (myLong.longValue() == myLong.intValue()) { 
         return new Integer(myLong.intValue()); 
        } else { 
         return myLong; 
        } 
       } 
      } 
     } catch (Exception ignore) { 
     } 
+0

촬영 - 내가 잠시 걸어서 :-) –

+0

@Bert_F하지만 당신의 의견은 실제 문제를 정확하게 지적하고 있습니다. 더글러스 크로크 포드가이 코드의 작성자라는 점을 감안할 때 빈 캐치 블록은 매우 무서운 것입니다 ... –

+0

>> 더글러스 크로크 포드를 고려해 볼 때, 그는 코드의 다른 부분에서'getClass(). getClassLoader()'를 사용합니다. 애플릿 또는 Webstart 응용 프로그램에서 실행되지 않습니다. – bestsss

관련 문제