2012-09-26 15 views
5

मैं जैक्सन सीएसवीपरसर का उपयोग किसी सीएसवी फ़ाइल को किसी ऑब्जेक्ट में पार्स करने का प्रयास कर रहा हूं जिसमें किसी अन्य वर्ग की सूची भी शामिल है।जावा जैक्सन: ऑब्जेक्ट्स की सूची वाले किसी ऑब्जेक्ट में एक सीएसवी फ़ाइल को पार्स करना

तो पहले 2 कॉलम में डेटा होता है जिसे मूल वर्ग से बाध्य करने की आवश्यकता होती है और बाद में डेटा को किसी अन्य वर्ग से बंधने की आवश्यकता होती है।

public class Person { 
    private String name; 
    private String age; 
    private List<CarDetails> carDetails; 

    //Getters+setters 
} 

public class CarDetails { 
    private String carMake; 
    private String carRegistration; 

    //Getters+setters 
} 

लॉग कैसा दिखेगा पार्स किया जा सकता:

John Doe, 30, Honda, D32GHF 

या सभी 2 कारों के साथ उपयोगकर्ताओं का एक और लॉग यह की तरह लग सकता है में:

Jane Doe, 29, Mini, F64RTZ, BMW, T56DFG 

प्रारंभिक 2 पार्स करने के लिए "व्यक्ति" वर्ग में डेटा के आइटम कोई समस्या नहीं है।

CsvMapper mapper = new CsvMapper(); 
CsvSchema schema = CsvSchema.builder() 
    .addColumn("name") 
    .addColumn("age") 

for(numberOfCars=2; numberOfCars!=0 ; numberOfCars--) 
    schema = schema.rebuild() 
     .addColumn("carMake") 
     .addColumn("carRegistration") 

MappingIterator<Map.Entry> it = mapper 
    .reader(Person.class) 
    .with(schema) 
    .readValues(personLog); 
    List<Person> people = new ArrayList<Person>(); 
    while (it.hasNextValue()) { 
     Person person = (Person) it.nextValue(); 
     people.add(person); 
    } 

लेकिन मुझे नहीं पता कि कारडेट्स को कैसे पार्स करना है। ऐसा लगता है कि मुझे मूल्य की खोज करने, एक नई कारडिलेट ऑब्जेक्ट बनाने और इसे व्यक्ति ऑब्जेक्ट में जोड़ने में सक्षम होना चाहिए, लेकिन मैं नहीं देख सकता कि उस जानकारी को कैसे निकाला जाए।


मेरे समाधान है निम्नलिखित:

List<Person> people = new ArrayList<Person>(); 

MappingIterator<Map<?,?>> it = mapper.reader(schema).withType(Map.class).readValues(personLog); 
while(it.hasNextValue()) { 
    Person person = new Person(); 
    CarDetails = new CarDetails(); 
    Map<?,?> result = it.nextValue(); 
    person.setName(result.get("name").toString()); 
    carDetails.setCarMake(result.get("carMake").toString()); 
    person.addCarDetails(carDetails); 
    people.add(person); 
}  

उत्तर

4

आप CsvMapper.readerWithSchemaFor के लिए जावाडोक को देखें, तो यह कहा गया है:

कोई सीएसवी प्रकार सरणियों मैप किया जा सकता या संग्रह

+1

हां ऐसा लगता है कि ऐसा करने का कोई साफ तरीका नहीं है। हालांकि, इस समय मैंने बस सब कुछ एक मानचित्र में डंप करने का फैसला किया है और चाबियाँ पहचानने के लिए स्कीमा का उपयोग करें और कक्षाओं को मैन्युअल रूप से पॉप्युलेट करें। उम्मीद कर रहा था कि एक बेहतर तरीका था। आपके सहयोग के लिए धन्यवाद। (मैं अपना समाधान अद्यतन के रूप में पोस्ट करूंगा और अपना उत्तर स्वीकार करूंगा)। – DanF7

+0

ध्यान दें कि यदि आप एक कस्टम धारावाहिक और deserializer जोड़ते हैं, तो आप इस तरह के रूपांतरण कर सकते हैं। इसके लिए आप मानक JSON 'ऑब्जेक्टमैपर' का भी उपयोग कर सकते हैं। – StaxMan

+1

बाद के संस्करणों (2.5 और ऊपर) के साथ, जैक्सन वास्तव में सरल सूची/सरणी प्रकारों का समर्थन करता है, जहां मूल्य स्ट्रिंग्स, एनम्स या संख्याओं जैसे स्केलर होते हैं। विभाजक डिफ़ॉल्ट अर्धविराम (";") से हैं, लेकिन किसी अन्य चरित्र में कॉन्फ़िगर किया जा सकता है। यह दुर्भाग्य से आपके मामले के लिए काम नहीं करेगा क्योंकि आप कॉलम के रूप में एक ही विभाजक का उपयोग कर रहे हैं; और मूल्य प्रकार भी अधिक जटिल हैं। लेकिन मैंने सोचा कि अगर दूसरों को सरल सूची/सरणी उपयोग की तलाश है तो यह उल्लेखनीय है। – StaxMan

संबंधित मुद्दे