Как привязать строку к объекту в 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("&");

на следующем шаге вы можете выполнить разбиение на каждый из элементов ключей массива, используя символ'='.

Ref:как разбить строку на Java


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


  }

}