2016-12-22 2 views
0

У меня есть строка в этом формате (включая фигурные скобки):Преобразования строки в соответствующей Java объект

{id=123, vehicle_name=Tesla Model X, price=80000.00, ... } 

Что является подходящим объектом Java, чтобы представить эту строку, и как я могу преобразовать его в этот объект?

Я хотел бы иметь возможность запросить объект, чтобы легко получить его значения, например. obj.get("vehicle_name"). Я попытался преобразовать его в JSON, используя JSONObject, однако это ожидает, что двоеточия будут делителями между ключами и значениями, а не знаком равенства.

+2

Соответствующее слово здесь. Есть тонны «подходящих» способов преобразования этого набора атрибутов в объект, начиная с простой «Карты» до фактических экземпляров класса «Car». Вероятно, поле 'id' - это фактически' serialUID' класса, и оно предназначено для десериализации. – Paul

+2

Возможный дубликат [Java parsing string] (http://stackoverflow.com/questions/4822552/java-parsing-string) –

+1

Где вы взяли эту строку? В идеале вы захотите изменить источник данных так, чтобы он выводился в формате, который вы можете легко анализировать. – 4castle

ответ

0
  • Строка сама по себе является объектом java.
  • Parsing String и заполнение объекта java не является чистым.
  • Вы можете создать java pojo Vehicle с атрибутами S как id, vehicle_name и т. Д. Предполагая, что ваша строка всегда будет следовать одному и тому же шаблону .
  • Разберите строку и заполните это поле.

Ниже простой пример, о том, как это сделать: -

public class Test { 

    public static void main(String[] args){ 
     String text="{id=123, vehicle_name=Tesla Model X, price=80000.00}"; 
     text=text.replaceAll("[{}]", ""); 
     String[] commaDelimitArray=text.split(","); 
     Vehicle vehicle=new Vehicle(); 
     for(int i=0;i<commaDelimitArray.length;i++){ 

      String[] keyValuePair=commaDelimitArray[i].split("="); 
      String key=keyValuePair[0].trim(); 
      String value=keyValuePair[1].trim(); 
      if("id".equals(key)){ 
       vehicle.setId(value); 
      } 
      else if("vehicle_name".equals(key)){ 
       vehicle.setVehicleName(value); 
      } 
      else if("price".equals(key)){ 
       vehicle.setPrice(value); 
      } 
     } 
     System.out.println(vehicle.getId()+" |"+vehicle.getVehicleName()); 
    } 

    static class Vehicle{ 
     private String id; 
     private String vehicleName; 
     private String price; 
     public String getId() { 
      return id; 
     } 
     public void setId(String id) { 
      this.id = id; 
     } 
     public String getVehicleName() { 
      return vehicleName; 
     } 
     public void setVehicleName(String vehicleName) { 
      this.vehicleName = vehicleName; 
     } 
     public String getPrice() { 
      return price; 
     } 
     public void setPrice(String price) { 
      this.price = price; 
     } 

    } 

} 
0

Это, как представляется, назначение в создании классов объектов. Если да, то вы хотите создать что-то вроде этого:

public class Car { 

    int id; 
    String name; 
    double price; 
    //include any other necessary variables 

    public Car(int id, String name, double price) { 
     this.id = id; 
     this.name = name; 
     this.price = price; 
     //include any other variables in constructor header and body 
    } 

    public void setID(int newID) { 
     id = newID; 
    } 

    public int getID() { 
     return id; 
    } 

    //add getters and setters for other variables in this same manner 
} 

Обратите внимание, что вы могли бы в качестве альтернативы создать конструктор, который не принимает никаких параметров и инициализирует переменные значения по умолчанию, а затем установите значения по отдельности с использованием методов сеттер.

В вашем основном классе вы хотите извлечь соответствующие подстроки из вашей строки, чтобы перейти к конструктору (или сеттерам). Существуют различные способы сделать это (вы можете прочитать о некоторых способах here); Я лично рекомендовал бы использовать regular expressions and a Matcher.

0

Если бы у меня была такая строка, которую нужно было преобразовать в объект, я бы создал класс со статическим методом, который возвращает объект Vehicle. Затем вы можете делать все, что хотите, с этим объектом. Несколько геттеров и сеттеров, и вам должно быть хорошо идти.

я пришел с какой-то код, который должен работать, как вы ожидаете, если я понял ваш вопрос :)

Там есть довольно много комментариев, так это должно помочь вам понять логику кода.

Класс автомобиля, где все разборки происходит в статическом методе с именем createVehicle (String keyValueString).

Основной класс:

import java.util.ArrayList; 
import java.util.List; 

public class main { 

    public static void main(String[] args) { 

     String vehicleString = "{id=123, vehicle_name=Tesla Model X, price=80000.00}"; 
     List<Vehicle> vehicles = new ArrayList<Vehicle>(); 
     Vehicle vehicle; 

     // call the static method passing the string for one vehicle 
     vehicle = Vehicle.createVehicle(vehicleString); 

     // if the id is -1, then the default constructor fired since 
     // there was an error when parsing the code. 
     if(vehicle.getId() == -1) { 
      System.out.println("Check your data buddy."); 
     } else { 
      vehicles.add(vehicle); 
     } 

     for(Vehicle v : vehicles){ 
      System.out.println("Vehicle id: " + v.getId()); 
      System.out.println("Vehicle name: " + v.getVehicle_name()); 
      System.out.println("Vehicle price: " + v.getPrice()); 
      System.out.println(); 
     } 
    } 
} 

Транспортное средство Класс:

import java.math.BigDecimal; 

public class Vehicle { 

    // declare your attributes mapped to your string 
    private int id; 
    private String vehicle_name; 
    private BigDecimal price; 

    // Start Constructor 
    // Default Constructor 
    public Vehicle() { 
     this.setId(-1); 
     this.setVehicle_name("Empty"); 
     this.setPrice(new BigDecimal(0.00)); 
    } 

    public Vehicle(int id, String vehicle_name, BigDecimal price) { 
     this.setId(id); 
     this.setVehicle_name(vehicle_name); 
     this.setPrice(price); 
    } 
    // End Constructor 

    // Start Getters and Setters 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getVehicle_name() { 
     return vehicle_name; 
    } 

    public void setVehicle_name(String vehicle_name) { 
     this.vehicle_name = vehicle_name; 
    } 

    public BigDecimal getPrice() { 
     return price; 
    } 

    public void setPrice(BigDecimal price) { 
     this.price = price; 
    } 

    // End Getters and Setters. 

    // Start Methods and Functions 

    // Given a string returns a string array split by a "," and with 
    // "{}" removed. 
    private static String[] splitString(String keyValueString) { 
     String[] split; 

     // Clean string from unwanted values 
     keyValueString = keyValueString.replaceAll("[{}]", ""); 
     split = keyValueString.split(","); 

     return split; 
    } 

    // Add a vehicle given a formatted string with key value pairs 
    public static Vehicle createVehicle(String keyValueString) { 
     int id = 0; 
     String vehicle_name = ""; 
     BigDecimal price = null; 
     String[] split; 
     Vehicle vehicle; 
     split = splitString(keyValueString); 

     // Loop through each keyValue array 
     for(String keyValueJoined : split){ 
      // split the keyValue again using the "=" 
      String[] keyValue = keyValueJoined.split("="); 
      // remove white space and add to a String variable 
      String key = keyValue[0].trim(); 
      String value = keyValue[1].trim(); 

      // check which attribute you currently have and add 
      // to the appropriate variable 
      switch(key){ 
       case "id": 
        id = Integer.parseInt(value); 
        break; 
       case "vehicle_name": 
        vehicle_name = value; 
        break; 
       case "price": 
        try { 
         price = new BigDecimal(Double.parseDouble(value)); 
        } catch (NumberFormatException e) { 
         e.printStackTrace(); 
        } 
        break; 
       default: 
        System.out.println("Attribute not available"); 
        return null;      
      } 
     } 
     // if any of the values have not been changed then either the 
     // data is incomplete or inconsistent so return the default constructor. 
     // Can be removed or changed if you expected incomplete data. It all 
     // depends how you would like to handle this. 
     if(id == 0 || vehicle_name.equals("") || price == null){ 
      vehicle = new Vehicle(); 
     } else { 
      //System.out.println(id); 
      vehicle = new Vehicle(id, vehicle_name, price); 
     } 

     return vehicle; 
    } 
    // End Methods and Functions 
} 

Программа, с учетом строки при условии, возвращает следующее при обращении вновь созданный объект атрибутов с использованием методов получения:

Номер транспортного средства: 123

Vehi Название НКИ: Tesla Model X

Автомобиля цены: 80000

Надеется, что это помогает.

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