反對我有不使用分割法在這個格式的字符串(從EBS支付網關響應)如何結合的字符串在Java
key1=value1&key2=value2&key3=value3
如何結合這個類對象?
public class MyClass {
private String key1;
private String key2;
private String key3;
// getter and setter methods
...
}
反對我有不使用分割法在這個格式的字符串(從EBS支付網關響應)如何結合的字符串在Java
key1=value1&key2=value2&key3=value3
如何結合這個類對象?
public class MyClass {
private String key1;
private String key2;
private String key3;
// getter and setter methods
...
}
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結束:即使我們不排除在[^&]
=
,這種表達的作品,因爲如果它可以在它的=
標誌匹配任何,該字符串也有一個「&',因此[^&=]
是不必要的。
如果你不熟悉正則表達式,爲了編譯它,'Pattern'和'Matcher'來自'java.util .regex'。 –
將你的字符串分成幾部分,然後使用你的setters來設置它們。
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 =值[0]
鍵2 =值[1]
KEY3 =值[2]
在此之後,拆分各個那些對=
符號
key1 [0] [0]
個值1 [0] [1]
KEY2 [1] [0]
值2 [1] [1]
KEY3 [2] [0]
值3 [2] [1]
因此,在第一個代碼塊,你有split[0].split("=")[1]
這是[0][1]
在下面的解釋。這是value1
它的快速&骯髒的,但它工作完全正常:)
嘗試以下
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
是的。爲了使它更具可讀性,我花了比你多幾分鐘的時間。 –
@JREN我認爲初始化構造函數中的值會更有意義,因爲某些人可以在創建對象後立即調用get值。在這種情況下,由於這些值沒有啓動,它會拋出錯誤 –
這可以通過使用來完成java中的拆分元素 將字符串存儲在變量中,並在java中調用拆分方法。
string = "key1=value1&key2=value2&key3=value3";
String[] keys = string.split("&");
在下一步中,您可以使用'='字符在數組鍵的每個元素上執行拆分。
嘗試使用的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);
+1來提出一個標準的Apache庫 – parasietje
隨着番石榴,你可以這樣做:
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
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);
}
}
您的課程是否需要存儲密鑰或密鑰值? – Pshemo
@vivek,如果你不想使用拆分,檢查我的答案(使用正則表達式)。 –
只是想知道什麼可以不使用拆分的原因?這是一項任務嗎? –