2010-02-06 11 views
19

ग्रोवी के साथ शुरू होने वाले टीसीएल डेवलपर के रूप में, मैं ग्रोवी में सूची और मानचित्र समर्थन के बारे में थोड़ा आश्चर्यचकित हूं। शायद मैं यहाँ कुछ याद कर रहा हूँ।ग्रोवी: क्या कोई स्ट्रिंग बॉक्स से बाहर नहीं है?

मुझे फ्लाई पर टीसीएल में स्ट्रिंग्स, सूचियों और सरणी/मानचित्रों के बीच कनवर्ट करने के लिए उपयोग किया जाता है। टीसीएल में,

"['a':2,'b':4]".each {key, value -> println key + " " + value} 

संभव होगा, जहां ग्रोवी में, प्रत्येक आदेश स्ट्रिंग के प्रत्येक चरित्र के माध्यम से कदम उठाता है।

यह एक समस्या है कि मैं आसानी से विभाजन या टोकनिज कमांड की तरह कुछ उपयोग कर सकता हूं, लेकिन क्योंकि एक क्रमबद्ध सूची या मानचित्र सिर्फ "ए: 2, बी: 4" नहीं है, यह थोड़ा सा है पार्स करने के लिए कठिन है।

ऐसा लगता है कि ग्रिफ़ोन डेवलपर्स एक स्ट्रिंगटैप लाइब्रेरी (http://code.google.com/p/stringtomap/) का उपयोग करते हैं लेकिन उदाहरण क्रमबद्ध मानचित्रों का सामना नहीं कर सकता है।

तो मेरा सवाल अब है: नक्शा या ग्रोवी में एक सूची का विश्लेषण करने का सबसे अच्छा तरीका क्या है?

चीयर्स, राल्फ

पुनश्च: यह एक ग्रूवी सवाल है, लेकिन मैं grails के साथ टैग किया है, क्योंकि मैं grails के लिए इस कार्यक्षमता जहाँ मैं यूआरएल के माध्यम से नक्शे पास करने के लिए चाहते हैं की जरूरत है

अपडेट: यह अभी भी मेरे लिए एक खुला प्रश्न है ... इसलिए यहाँ जो लोग एक ही समस्या है के लिए कुछ अपडेट कर रहे हैं:

  • जब आप एक स्ट्रिंग में एक मानचित्र की बारी है, एक .toString() फिर होगा किसी चीज में गले लगाओ जिसे सभी मामलों में किसी मानचित्र में वापस नहीं किया जा सकता है, लेकिन .inspect() आपको एक स्ट्रिंग देगा जो मानचित्र पर वापस मूल्यांकन किया जा सकता है!
  • Grails में
  • , वहाँ एक .encodeAsJSON() और JSON.parse(String) है - दोनों महान काम करते हैं, लेकिन मैं अभी तक बाहर की जाँच नहीं की है क्या पार्सर JSON कार्य (संभावित सुरक्षा समस्या)
+3

यदि आप grails का उपयोग कर रहे हैं और एक नक्शा चाहते हैं, तो मैं एक JSON संदेश पोस्ट करना चाहता हूं।क्लाइंट साइड पर उत्पन्न करना शायद आसान है और जेएसओएन का मूल्यांकन करने के लिए चीजों में गठित चीजें हैं। –

+0

thanx। जेसन वास्तव में एक बहुत अच्छा विकल्प हो सकता है! – rdmueller

+1

Grails में यूआरएल के माध्यम से नक्शे पास करना यूआरएल मैपिंग के लिए नौकरी की तरह लगता है। Grails उपयोगकर्ता मार्गदर्शिका के एंबेडेड वैरिएबल अनुभाग देखें (खंड 6.4.2)। आप जो भी मानचित्र चाहते हैं उसे पास करने के लिए आप एक कस्टम यूआरएल संरचना को परिभाषित कर सकते हैं, यानी http://myapp.com/controller/action/key1/value1/key2/value2 यह बहु-आयामी मानचित्रों के लिए बहुत अच्छा काम नहीं करेगा , या विशाल डेटा संरचनाएं, लेकिन मैं दलील दूंगा कि उनको यूआरएल के माध्यम से पारित नहीं किया जाना चाहिए। –

उत्तर

8

बिल्कुल देशी नहीं ग्रूवी, लेकिन JSON के serializing के लिए उपयोगी: मेटा साथ

import groovy.json.JsonBuilder 
import groovy.json.JsonSlurper 

def map = ['a':2,'b':4 ] 
def s = new JsonBuilder(map).toString() 
println s 

assert map == new JsonSlurper().parseText(s) 

-प्रोग्रामिंग:

import groovy.json.JsonBuilder 
import groovy.json.JsonSlurper 

Map.metaClass.toJson = { new JsonBuilder(delegate).toString() } 
String.metaClass.toMap = { new JsonSlurper().parseText(delegate) } 

def map = ['a':2,'b':4 ] 
assert map.toJson() == '{"a":2,"b":4}' 
assert map.toJson().toMap() == map 

दुर्भाग्य असल में, toString() विधि को ओवरराइड करना संभव नहीं है ...

+1

मुझे लगता है कि यह एक साफ समाधान है ... थोड़ा सा मेटा प्रोग्रामिंग के साथ , इस कार्यक्षमता को स्ट्रिंग क्लास में आसानी से जोड़ा जा सकता है ... – rdmueller

+0

... और मानचित्र वर्ग ... – rdmueller

3

मुझे लगता है कि आप देख रहे हैं के साथ क्या होगा ConfigObject और ConfigSlurper का संयोजन। ऐसा कुछ चाल करेगा।

def foo = new ConfigObject() 
foo.bar = [ 'a' : 2, 'b' : 4 ] 

// we need to serialize it 
new File('serialized.groovy').withWriter{ writer -> 
    foo.writeTo(writer) 
} 

def config = new ConfigSlurper().parse(new File('serialized.groovy').toURL())  

// highest level structure is a map ["bar":...], that's why we need one loop more 
config.each { _,v -> 
    v.each {key, value -> println key + " " + value} 
} 
+0

thanx, slurper के बारे में जानना अच्छा है! – rdmueller

21

आप का उपयोग का मूल्यांकन अपने परिदृश्य के कुछ करने की कोशिश करना, यह आप के लिए क्या देख रहे हो सकती चाहते हो सकता है।

def stringMap = "['a':2,'b':4]" 
def map = evaluate(stringMap) 

assert map.a == 2 
assert map.b == 4 

def stringMapNested = "['foo':'bar', baz:['alpha':'beta']]" 
def map2 = evaluate(stringMapNested) 

assert map2.foo == "bar" 
assert map2.baz.alpha == "beta" 
+0

thanx। मुझे लगता है कि यह जो मैं खोज रहा था उसके करीब है! – rdmueller

+0

वाह। बस ध्यान दिया कि समाधान काफी बड़ा जोखिम जोखिम है! यदि डेटा यूआरएल के माध्यम से पारित किया जाता है और हम केवल एक मूल्यांकन() करते हैं, तो सबकुछ हो सकता है! तो मुझे लगता है कि JSON समाधान बेहतर तरीका होगा ... – rdmueller

+3

आप 'इवल' कक्षा का उपयोग कर सकते हैं जो ग्रोवीशेल के शीर्ष पर एक साधारण सहायक है: 'def map = Eval.me ("[' a ': 2, 'बी': 4] ")' –

1

आप का मूल्यांकन() का उपयोग करना पड़ता करना नहीं चाहते हैं:

def stringMap = "['a':2,'b':4]" 
stringMap = stringMap.replaceAll('\\[|\\]','') 
def newMap = [:] 
stringMap.tokenize(',').each { 
kvTuple = it.tokenize(':') 
newMap[kvTuple[0]] = kvTuple[1] 
} 
println newMap 
+0

यह एक बहुत ही सीमित है क्योंकि यह केवल स्ट्रिंग्स के साथ काम करेगा। उदाहरण के लिए, आपके उदाहरण में नए मैप में रखे गए मान स्ट्रिंग्स "2" और "4" होंगे, न कि संख्या 2 और 4. –

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