【问题标题】:How to bind a string to object in java如何将字符串绑定到java中的对象
【发布时间】:2013-07-06 23:33:38
【问题描述】:

我有一个这种格式的字符串(来自 EBS 支付网关的响应)

key1=value1&key2=value2&key3=value3

如何不使用split方法绑定到这个类对象?

public class MyClass {

    private String key1;
    private String key2;
    private String key3;
    // getter and setter methods
    ...
}

【问题讨论】:

  • 您的班级是否需要为键存储键或值?
  • @vivek,如果您不想使用拆分,请查看我的答案(使用正则表达式)。
  • 只是想知道不使用拆分的原因是什么?是作业吗?
  • @user1614217 也许,但也许他认为有办法做到这一点而无需拆分,并想知道如何做到这一点。
  • @SteveP。是的,我只是想检查一下,这就是我发表评论的原因。

标签: java data-binding


【解决方案1】:

将你的字符串分成几部分,然后使用你的设置器设置它们。

String str = "key1=value1&key2=value2&key3=value3";
String[] split = str.split("&");

MyClass obj = new MyClass();

obj.setKey1(split[0].split("=")[1]);
obj.setKey2(split[1].split("=")[1]);
obj.setKey3(split[2].split("=")[1]);

第一次拆分,在&符号处拆分字符串。

key1=value1 [0]

key2=value2 [1]

key3=值 [2]

之后,您将= 符号上的每一个分开

key1 [0][0]

值1 [0][1]

key2 [1][0]

值2 [1][1]

键3 [2][0]

值3 [2][1]

所以在第一个代码块中,你有split[0].split("=")[1],在下面的解释中是[0][1]。那是value1

它又快又脏,但效果很好:)

【讨论】:

  • 不使用split方法就没有别的办法了
  • @vivek 如果您真的想避免拆分方法,可以使用StringTokenizermkyong.com/java/java-stringtokenizer-example
  • @vivek,是的,有。看我的回答。
  • @JREN 谢谢!你也有一个。
【解决方案2】:

尝试关注

public class MyClass {

    private String key1;
    private String key2;
    private String key2;

    public MyClass(String k1,String k2,String k3)
    {
        Key1 = k1;
        Key2 = k2;
        Key3 = k3;
    }
// getter and setter methods
...
}

在创建类对象时

String response = "key1=value1&key2=value2&key3=value3";
String[] keys = response.split("&");
MyClass m = new MyClass(keys[0].split("=")[1],keys[1].split("=")[1],keys[2].split("=")[1])

【讨论】:

  • 是的,对。只是为了让它更具可读性,我比你多花了几分钟。
  • @JREN 我认为在构造函数中初始化值更有意义,因为有些人可以在创建对象后立即调用获取值。在这种情况下,由于未启动值,它将引发错误
【解决方案3】:

这可以通过在java中使用split元素来完成 将字符串存储在变量中并在 java 中调用 split 方法。

string = "key1=value1&key2=value2&key3=value3";
String[] keys = string.split("&");

在下一步中,您可以使用“=”字符对数组键的每个元素执行拆分。

参考:How to split a string in Java

【讨论】:

    【解决方案4】:

    尝试使用 beanutils 和地图

    String[] keys = "key1=value1&key2=value2&key3=value3".split("&");
    HashMap keyMap = new HashMap();
    for(String key:keys){
    String[] pair = key.split("=");
    keyMap.put(pair[0],pair[1]);
    }
    MyClass  myCls=new MyClass();
    BeanUtils.populate(myCls,keyMap);
    

    【讨论】:

      【解决方案5】:

      使用 Guava,您可以这样做:

      String str = "key1=value1&key2=value2&key3=value3";
      Map<String, String> map = Splitter.on('&').withKeyValueSeparator("=").split(str);
      

      而且你可以随心所欲地使用键和值。例如

      mc.setKey1(map.get("key1")); // will set key1 to value1
      

      【讨论】:

        【解决方案6】:
        String template = "key1=value1&key2=value2&key3=value3";
        String pattern = "&?([^&]+)="; 
        
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(template);
        
        while (m.find()) 
        {
            System.out.println(m.group(1)); //prints capture group number 1
        }
        

        输出:

           key1
           key2  
           key3
        

        当然,这可以缩短为:

        Matcher m = Pattern.compile("&?([^&]+)=").matcher("key1=value1&key2=value2&key3=value3");
        
        while (m.find()) 
        {
            System.out.println(m.group(1)); //prints capture group number 1
        }
        

        细分:

        "&?([^&]+)="; 
        

        &amp;?: 表示 0 或 1 &amp;
        [^&amp;]+ 匹配 1 个或多个不等于 &amp; 的字符
        ([^&amp;]+) 捕获上述字符(允许您提取它们)
        &amp;?([^&amp;]+)= 捕获上述字符,使它们以 0 或 1 &amp; 开头并以 = 结尾

        注意:即使我们没有在[^&amp;] 中排除=,这个表达式仍然有效,因为如果它可以匹配任何带有= 符号的东西,那么该字符串中也会有一个'&',所以[^&amp;=] 是不必要的。

        【讨论】:

        • 如果您不熟悉正则表达式,要编译它,PatternMatcher 来自 java.util.regex
        【解决方案7】:
        You can use java reflection :
        
        import java.lang.reflect.InvocationTargetException;
        import java.lang.reflect.Method;
        
        public class MyClass {
        
          private String key1;
          private String key2;
          private String key3;
        
          public void setKey1(String key1) {
            this.key1 = key1;
          }
        
          public void setKey2(String key2) {
            this.key2 = key2;
          }
        
          public void setKey3(String key3) {
            this.key3 = key3;
          }
        
          public void setKey(String input) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
            String[] strings = input.split("&");
            String methodName = null;
            Method setter = null;
            for(String keyValue : strings) {
              String[] keyValuePair = keyValue.split("=");
              methodName = toSetterMethod(keyValuePair[0]);
              setter = getMethod(methodName);
              if (setter != null) {
                setter.setAccessible(true);
                setter.invoke(this, keyValuePair[1]);
              }
            }
          }
        
          private Method getMethod(String methodName) {
            try {
              Method[] methods = MyClass.class.getMethods();
              for (Method method : methods) {
                if (method.getName().equals(methodName)) {
                  return method;
                }
              }
            } catch (SecurityException e) {
            }
            return null;
        
          }
        
          private String toSetterMethod(String property) {
            String setter = "set";
            setter += property.substring(0, 1).toUpperCase() + property.substring(1);
            return setter;
          }
          public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
            String input = "key1=value1&key2=value2&key3=value3";
            MyClass myClass = new MyClass();
            myClass.setKey(input);
        
            System.out.println(myClass.key1);
            System.out.println(myClass.key2);
            System.out.println(myClass.key3);
        
        
          }
        
        }
        

        【讨论】:

        • without using split method? 是问题的一部分
        • 对不起,但我认为“拆分”方法问题不大。你可以自己做。
        猜你喜欢
        • 2012-01-29
        • 2011-12-28
        • 1970-01-01
        • 2019-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多