8

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

key1=value1&key2=value2&key3=value3

如何在不使用拆分方法的情况下绑定到此类对象?

public class MyClass {

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

7 回答 7

6

尝试关注

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])
于 2013-07-09T11:30:32.883 回答
3
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
}

分解:

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

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

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

于 2013-07-09T11:46:22.760 回答
2

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

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]);

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

键1=值1 [0]

键2=值2 [1]

键 3=值 [2]

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

键1 [0][0]

值1 [0][1]

键2 [1][0]

值2 [1][1]

键 3 [2][0]

值3 [2][1]

因此,就像在第一个代码块中一样,您可以split[0].split("=")[1][0][1]下面的说明中找到它。那是value1

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

于 2013-07-09T11:22:45.877 回答
1

尝试使用 beanutils 和 map

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);
于 2013-07-09T11:43:47.413 回答
1

使用番石榴,您可以这样做:

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
于 2013-07-09T11:45:11.040 回答
0

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

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

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

参考:如何在 Java 中拆分字符串

于 2013-07-09T11:32:49.173 回答
0
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);


  }

}
于 2013-07-09T12:01:19.773 回答