/ / json4s के साथ JString को इंट में कैसे बदलें - json, scala, json4s

json4s - json, scala, json4s के साथ जेस्ट्रिंग टू इंट को कैसे परिवर्तित करें

हमने हाल ही में जेरक्सन से json4s पर स्विच किया, हमने जल्द ही पता चला कि इन दो पुस्तकालयों का डिफ़ॉल्ट डी-सीरियलाइजेशन व्यवहार समान है।

जिन मुद्दों पर हम चल रहे हैं, उनमें से एक यह है कि हम कभी-कभी json इनपुट प्राप्त करते हैं जहां एक संख्या फ़ील्ड को संख्या के बजाय स्ट्रिंग के रूप में दर्शाया जाता है

//example json object with string representation of "id"
{
"id" : "12545"
}


//example json object with number representation of "id"
{
"id" : 12345
}

इनको निम्न वर्ग में शामिल करने की आवश्यकता है

case class example(id:Int)

यह हमारे सामान्य सेटअप को मनमाने ढंग से कक्षाओं में रखने के लिए है

import org.json4s.native.Serialization._
import org.json4s._
import org.json4s.native.JsonMethods._

object Json {
implicit val formats = DefaultFormats
def parse[T](json:String)(implicit mf: Manifest[T]):T =  {
org.json4s.native.JsonMethods.parse(input).extract[T]
}
}

लेकिन जब भी हम उस वस्तु के स्ट्रिंग प्रतिनिधित्व के साथ जोंस ऑब्जेक्ट को पार्स करने का प्रयास करते हैं जो इसे फेंकता है और संदेश के साथ अपवाद:

ऑफ़र के लिए कोई उपयोग करने योग्य मूल्य नहीं आईडी के लिए कोई उपयोग करने योग्य मूल्य पता नहीं कैसे JString (12545) को इंट में बदलें

मैं एक रास्ता तय करने के लिए चारों ओर देख रहा हूँइंटेगर फ़ील्ड्स के लिए कस्टम रीडर जहां यह इंटेगर में तार को पार्स करने का प्रयास करता है, लेकिन मैं अभी तक एक समाधान खोजने के लिए हूं जो हमारे उपयोग के मामले को हल करता है। हमें विरासत के अनुप्रयोगों का समर्थन करने के लिए सामान्य समाधान को पकड़ने की आवश्यकता है।

किसी को पता है कि यह कैसे प्राप्त करने के लिए?

उत्तर:

उत्तर № 1 के लिए 6

धन्यवाद, मैं इस धारावाहिक निर्माता के साथ समाप्त हुआ:

object StringToLong extends CustomSerializer[Long](format => ({ case JString(x) => x.toLong }, { case x: Long => JInt(x) }))
implicit val formats = DefaultFormats + StringToLong

जवाब के लिए 3 № 2

मैं "मैं केवल उस समाधान को पोस्ट करूंगा जो मैं आया था, जहां मैं इंटीग्रर्स के लिए कस्टम सीरियललाइज़र का उपयोग करता हूं

import org.json4s.native.Serialization._
import org.json4s._
import org.json4s.native.JsonMethods._
import org.json4s.native.Serialization._

object Json {

implicit val formats = Serialization.formats(NoTypeHints) + new NumberSerializer()

def parse[T](json:String)(implicit mf: Manifest[T]):T =  {
org.json4s.native.JsonMethods.parse(input).extract[T]
}
}

class NumberSerializer extends CustomSerializer[Int](format => (
{
case JInt(x) => x.toInt
case JDouble(x) => x.toInt
case JString(x) => x.toInt
},
{
case x: Int => JInt(x)
}
))