【问题标题】:Parsing Objects from String in Java在 Java 中从字符串中解析对象
【发布时间】:2011-01-02 09:05:15
【问题描述】:

我正在尝试编写一个通用方法来解析字符串中的对象。需要明确的是,我有以下不太优雅的实现:

public static Object parseObjectFromString(String s, Class class) throws Exception {
  String className = class.getSimpleName();
  if(className.equals("Integer")) {
    return Integer.parseInt(s);
  }
  else if(className.equals("Float")) {
    return Float.parseFloat(s);
  }
  else if ...

}

有没有更好的方法来实现这个?

【问题讨论】:

  • 请添加您要使用该方法的上下文。这将有助于提供适当的解决方案。

标签: java reflection types


【解决方案1】:

我不确定你想做什么。以下是一些不同的猜测:

  • 您希望能够将对象转换为字符串,反之亦然。

您应该研究序列化。我使用XStream,但writeObjectjava.beans.XMLEncoder 也可以。

  • 用户输入文本,您想将其强制为“正确”类型,其中有很多。

通常,这意味着用户规范存在问题。你从用户那里收到了什么,为什么会有这么多不同的种类?

一般来说,您会希望类型尽可能宽泛:如果是数字,请使用 double,而对于其他几乎所有内容,请使用 String。然后从该变量构建其他东西。但是不要传入类型:通常,类型应该很明显。

【讨论】:

  • +1 - 我怀疑 OP 试图解决错误的问题。
【解决方案2】:

NumberUtils.createNumber(str)(来自 apache commons-lang)

它决定了要创建什么类型的数字,所以你不会通过类。

【讨论】:

    【解决方案3】:

    枚举呢?

      public enum Types {
    
         INTEGER {
            @Override
            public Object parse(String s) { return Integer.parseInt(s); }
         },
         FLOAT {
            @Override
            public Object parse(String s) { return Float.parseFloat(s); } 
         }
         ...
         ;
    
         public abstract Object parse(String s);
    
         public static Object parseObjectFromString(String s, Class<?> cls)  {
            return valueOf(cls.getSimpleName().toUpperCase()).parse(s);
         }
      }
    
      public static void main(String[] args) {
         System.out.println(Types.parseObjectFromString("5", Integer.class));
      }
    

    【讨论】:

    • 不知道; +1 用于类型标记。返回Number 并指定有界通配符类型Class&lt;? extends Number&gt; 也可能很有趣。
    【解决方案4】:

    如果这些是您唯一的示例类型,那么您还可以执行以下操作:

    Constructor ctor = Class.getConstructor( String.class ); 
    return ctor.newInstance( s );
    

    更多信息可能会提供更好的答案。如果那里还没有满足您的规范的实用程序代码,我会感到非常惊讶。根据实际需求,有几种方法可以解决这个问题。

    【讨论】:

      【解决方案5】:

      要将一个对象(这里是字符串)转换为另一个对象,可以使用transmorph

      Transmorph transmorph = new Transmorph(new DefaultConverters());
      float myFloat = transmorph.convert("55.2",Float.TYPE);
      
      long[] longsArray = transmorph.convert(new Integer[] { 1, 2, 3, 4 }, long[].class);
      

      【讨论】:

        【解决方案6】:

        你的方法可以有一行代码:

        public static <T> T parseObjectFromString(String s, Class<T> clazz) throws Exception {
            return clazz.getConstructor(new Class[] {String.class }).newInstance(s);
        }
        

        使用不同的类进行测试:

        Object obj1 = parseObjectFromString("123", Integer.class);
        System.out.println("Obj: " + obj1.toString() + "; type: " + obj1.getClass().getSimpleName());
        BigDecimal obj2 = parseObjectFromString("123", BigDecimal.class);
        System.out.println("Obj: " + obj2.toString() + "; type: " + obj2.getClass().getSimpleName());
        Object obj3 = parseObjectFromString("str", String.class);
        System.out.println("Obj: " + obj3.toString() + "; type: " + obj3.getClass().getSimpleName());
        Object obj4 = parseObjectFromString("yyyy", SimpleDateFormat.class);
        System.out.println("Obj: " + obj4.toString() + "; type: " + obj4.getClass().getSimpleName());
        

        输出:

        Obj: 123; type: Integer
        Obj: str; type: String
        Obj: 123; type: BigDecimal
        Obj: java.text.SimpleDateFormat@38d640; type: SimpleDateFormat
        

        【讨论】:

        • +1 的建议大致相同。他们都有一个带字符串的构造函数。
        猜你喜欢
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多