Как привязать строку к объекту в java
у меня есть строка в этом формате (ответ от платежного шлюза EBS)
key1=value1&key2=value2&key3=value3
Как привязать к этому объекту класса без использования метода split?
public class MyClass {
private String key1;
private String key2;
private String key3;
// getter and setter methods
...
}
7 ответов
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 &
и =
NB: даже если мы не сделали исключить =
на [^&]
, это выражение работает, потому что если оно может соответствовать чему-либо с =
войдите в него, эта строка также будет иметь ' & ' в нем, так что [^&=]
ненужно.
попробовать следующие
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 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]
value1 [0][1]
key2 [1][0]
value2 [1][1]
key3 [2][0]
value3 [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);
С 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
Это можно сделать с помощью элемента split в java Сохраните строку в переменной и вызовите split methord в java.
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);
}
}