2011-02-08 8 views
1

大きなxmlをjson文字列に変換するのにorg.jsonを使用しています。しかし、数字0の場合は文字列 "0"を作成し、5や2のような他の数字はうまく動作して実数になります。json.orgのゼロは数字ではなく文字列として保存されます

のxml:

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

のjava:JSONを結果

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

"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') { 

例外文字列が "0"の場合は1文字だけです。例外は捕捉され、変換メソッドは基本的に元の文字列( "0")をそのまま返します。

ない多くのオプション:

  1. レポート迅速な修正のためのバグと希望。
  2. あなた自身のために、自分でファイルのコピーを作成してください。
  3. 0の代わりに0.0を受け入れることができる場合は、XMLの「0」を「0.0」とするとよいでしょう。 (クレジット@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

シュート - あなたが1分ほど歩いたために私を打ち負かしました:-) –

+0

@Bert_F、あなたのコメントは実際の問題を正確に示しています! –

+0

>> douglas crockfordを考慮すると、彼はまた、getClass()。getClassLoader()をコードの他の部分でも使用しています。アプレットまたはWebスタートアプリケーションでは実行されません。 – bestsss

関連する問題