我有一个这种格式的字符串(来自 EBS 支付网关的响应)
key1=value1&key2=value2&key3=value3
如何在不使用拆分方法的情况下绑定到此类对象?
public class MyClass {
private String key1;
private String key2;
private String key3;
// getter and setter methods
...
}
我有一个这种格式的字符串(来自 EBS 支付网关的响应)
key1=value1&key2=value2&key3=value3
如何在不使用拆分方法的情况下绑定到此类对象?
public class MyClass {
private String key1;
private String key2;
private String key3;
// getter and setter methods
...
}
尝试关注
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])
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 [^&]
,这个表达式仍然有效,因为如果它可以匹配任何带有=
符号的内容,那么该字符串中也会有一个 '&',所以[^&=]
是不必要的。
将您的字符串分成几部分,然后使用您的设置器设置它们。
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
它又快又脏,但效果很好:)
尝试使用 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);
使用番石榴,您可以这样做:
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
这可以通过使用 java 中的 split 元素将您的字符串存储在变量中并在 java 中调用 split 方法来完成。
string = "key1=value1&key2=value2&key3=value3";
String[] keys = string.split("&");
在下一步中,您可以使用“=”字符对数组键的每个元素执行拆分。
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);
}
}