मैं एक वेब सेवा से एक json प्रतिक्रिया पार्स कर रहा हूँजिसमें कुछ क्षेत्रों को हाइफ़न का उपयोग करके परिभाषित किया गया है। मैं इन नामों को अपनी स्कैला केस क्लास में मिश्रित केस के नामों में बदलना चाहता हूं। मैं camelizeKeys वजीफा का उपयोग करने के लिए सोचा था, लेकिन यह काम करने के लिए प्रतीत नहीं होता है।
{"offset":0,"total":359,"per-page":20}
में परिवर्तित होने के लिए:
case class Response(offset: Int, total: Int, perPage: Int)
और मैं करता हूँ:
parse(str).camelizeKeys.extract[Response]
मुझे त्रुटि मिलती है:
Ex: org.json4s.package $ MappingException: PerPage के लिए कोई उपयोग करने योग्य मूल्य नहीं है मूल्य नहीं मिला जिसे इंट में बदला जा सकता है
उत्तर:
जवाब के लिए 0 № 1चारों ओर एक काम पाठ को पार्स करने से पहले एक अंडरस्कोर के साथ हाइफ़न की सभी घटनाओं को बदलना है। तो एक निम्नलिखित कर सकता है:
parse(str.replaceAll("([a-z])-([a-z])", "$1_$2")).camelizeKeys.extract[Response]
लेकिन यह समाधान जटिल के साथ ही सीमित हैडेटा संरचनाएं यह काम नहीं कर सकती हैं; यदि किसी फ़ील्ड मान में ऐसा कोई पैटर्न है, तो आप डेटा को दूषित कर सकते हैं। इसलिए एक और पूर्ण समाधान मेरे स्वयं के प्रतिस्थापन कार्य को लिखना था:
def replaceAll(str: String, regex: String)(f: String => String) = {
val pattern = regex.r
val (s, i) = (("", 0) /: pattern.findAllMatchIn(str)) { case ((s, i), m) =>
(s + str.substring(i, m.start) + f(m.toString), m.end)
}
s + str.substring(i)
}
और इसे मेरे जस स्ट्रिंग में लागू करें:
replaceAll(str, ""[0-9a-z\-]*":")(_.replace("-", "_"))