2016-07-13 15 views
2

私はいくつかの文字列変数を含むJavaオブジェクトを持っています。 String値の1つが英数字の場合、Javaオブジェクトからjsonメッセージを作成すると、変換によって引用された値が返されます。それ以外の場合、変換は数値を返します。JavaのJSONパーサーが自動的に文字列を数値/整数に変換します

例:

Class User { 
    String userid , password; 
} 

userid = "tom"password = "123456"場合、JSON変換はバック

"userid":"tom""password":123456(数値)を返します

それは実際に"password":"123456"

どのように達成することができますを返す必要がありますこの?私はjson.orgのJavaパーサーを使用しています。以下は、JavaオブジェクトをJsonに変換するコードスニペットです。

final JSONObject jsonObject = XML.toJSONObject(writer.toString()); 
res = jsonObject.toString(4); 

答えて

1

それは理由JSONObjectstringToValue方法です。 タイプを推測しようとします。 オープンソースなので、必要に応じて変更できます。 文字列を返します。

/** 
* Try to convert a string into a number, boolean, or null. If the string 
* can't be converted, return the string. 
* 
* @param string 
*   A String. 
* @return A simple JSON value. 
*/ 
public static Object stringToValue(String string) { 
    if (string.equals("")) { 
     return string; 
    } 
    if (string.equalsIgnoreCase("true")) { 
     return Boolean.TRUE; 
    } 
    if (string.equalsIgnoreCase("false")) { 
     return Boolean.FALSE; 
    } 
    if (string.equalsIgnoreCase("null")) { 
     return JSONObject.NULL; 
    } 

    /* 
    * If it might be a number, try converting it. If a number cannot be 
    * produced, then the value will just be a string. 
    */ 

    char initial = string.charAt(0); 
    if ((initial >= '0' && initial <= '9') || initial == '-') { 
     try { 
      if (string.indexOf('.') > -1 || string.indexOf('e') > -1 
        || string.indexOf('E') > -1 
        || "-0".equals(string)) { 
       Double d = Double.valueOf(string); 
       if (!d.isInfinite() && !d.isNaN()) { 
        return d; 
       } 
      } else { 
       Long myLong = new Long(string); 
       if (string.equals(myLong.toString())) { 
        if (myLong.longValue() == myLong.intValue()) { 
         return Integer.valueOf(myLong.intValue()); 
        } 
        return myLong; 
       } 
      } 
     } catch (Exception ignore) { 
     } 
    } 
    return string; 
} 
0

代わりstaxonライブラリを使用することもできます。そのJsonXMLConfigBuilderは、あなたが(あなたがプリミティブ値を処理する方法を定義することができますようにautoprimitiveなど)、変換中の動作を制御することができます。ここでは、コードです:

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><userid>tom</userid><password>123456</password></root>"; 
ByteArrayOutputStream bao = new ByteArrayOutputStream(); 
JsonXMLConfig config = new JsonXMLConfigBuilder().autoArray(true).autoPrimitive(false).prettyPrint(true).build(); 
try { 
    XMLEventReader reader = XMLInputFactory.newInstance().createXMLEventReader(IOUtils.toInputStream(xml)); 
    XMLEventWriter writer = new JsonXMLOutputFactory(config).createXMLEventWriter(bao); 

    writer.add(reader); 
    reader.close(); 
    writer.close(); 
} finally { 
    bao.close(); 
} 

String json = bao.toString(); 

JsonXMLConfigBuilder()...autoPrimitive(false)あなたが探しているのトリックを行います。数値フィールドは文字列として保存されます。このサンプルコードでは

、あなたが(ちょうどIOUtils.toInputStream(xml)用)Saxion +コモンズ-IOを追加する必要があります。

<dependency> 
    <groupId>de.odysseus.staxon</groupId> 
    <artifactId>staxon</artifactId> 
    <version>1.3</version> 
</dependency> 

<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.4<version> 
</dependency> 

staxon上の一部のマニュアル:

関連する問題