2013-07-09 2 views
8

У меня есть строка в этом формате (ответ от EBS Payment Gateway)Как связать строку на объект в Java

key1=value1&key2=value2&key3=value3 

Как привязать к этому объекту класса без использования разделения метод?

public class MyClass { 

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

Нужно ли вашему классу хранить ключи или значения для ключей? – Pshemo

+0

@vivek, если вы не хотите использовать split, проверьте мой ответ (с помощью regex). –

+2

Просто интересно, что может быть причиной не использования split? Это задание? –

ответ

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 & и заканчиваются =

NB: несмотря на то, что мы не исключаем = в [^&], это выражение работает, потому что если он может соответствовать что-нибудь с = знаком в нем, эта строка также будет иметь "& ', поэтому [^&=] не требуется.

+0

Если вы не знакомы с регулярным выражением, чтобы получить это для компиляции, 'Pattern' и' Matcher' находятся в 'java.util .regex'. –

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

Это быстро & грязный, но он отлично работает :)

+0

Нет другого пути без использования метода split – vivek

+0

@vivek вы можете использовать 'StringTokenizer', если вы действительно хотите избежать метода split. http://www.mkyong.com/java/java-stringtokenizer-example/ – JREN

+1

@vivek, да, есть. См. Мой ответ. –

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]) 
+0

Это в основном то, что я сказал, только труднее читать. – JREN

+0

Да, правильно. Чтобы сделать его более читаемым, я потратил несколько минут больше, чем вы. –

+1

@JREN Я думаю, что инициализация значения в конструкторе имеет больше смысла, поскольку некоторые могут вызвать get для значений сразу после создания объекта. В этом случае, когда значения не инициируются, он будет вызывать ошибку –

0

Это может быть сделано с помощью split element в java Сохраните вашу строку в переменной и вызовите split methodord в java.

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

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

Ref: How to split a string in Java

1

Попробуйте использовать 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); 
+0

+1 для предложения стандартной библиотеки Apache. – parasietje

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


    } 

} 
+0

'без использования метода split?' Был частью вопроса – Manuel

+0

извините, но я думаю, что метод «split» не является большой проблемой. Вы можете сделать это сами. – Nguyen

Смежные вопросы