/ / scala json4s खाली खेतों को संभालना - scala, json4s

scala json4s खाली खेतों को संभालने के लिए

यह दो सैंपल जेनसन डेटा है।

pattern1

{
"data_type": "stats",
"data": [
{
"id" : "123abc",
"promoted_tweet_timeline_card_engagements": [ 0 ],
"promoted_account_follow_rate": [ 0 ],
"conversion_sign_ups": [ 0 ] // <- sometime not passed this field
}
]
}

और, कभी-कभी पास नहीं हुआ

pattern2

{
"data_type": "stats",
"data": [
{
"id" : "123abc",
"promoted_tweet_timeline_card_engagements": [ 0 ],
"promoted_account_follow_rate": [ 0 ]
}
]
}

मैं इस केस क्लास में बदलना चाहता हूं।

case class Campaign(
id: String,
promoted_tweet_timeline_card_engagements: List[Any],
promoted_account_follow_rate: List[Any],
conversion_sign_ups: Option[List[Any]],
)

यह मुख्य कोड है

for {
JObject(data) <- json \ "data"
JField("id", JString(id)) <- data
JField("promoted_tweet_timeline_card_engagements", JArray(promoted_tweet_timeline_card_engagements)) <- data
JField("promoted_account_follow_rate", JArray(promoted_account_follow_rate)) <- data
JField("conversion_sign_ups", JArray(conversion_sign_ups)) <- data // It can not be handled correctly when field does not exists
} yield Campaign(
id = id,
promoted_tweet_timeline_card_engagements = promoted_tweet_timeline_card_engagements,
promoted_account_follow_rate = promoted_account_follow_rate,
conversion_sign_ups = Option(conversion_sign_ups)
)

conversion_sign_ups पैटर्न 2 डेटा होने पर फ़ील्ड को सही तरीके से हैंडल नहीं किया जा सकता है।

मैं इसे एक केस क्लास में संभालना चाहता हूं। मैं इसे कैसे करूं??

उत्तर:

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

समस्या यह रेखा प्रतीत होती है:

JField("conversion_sign_ups", JArray(conversion_sign_ups)) <- data

जब डेटा ऑब्जेक्ट में json ऑब्जेक्ट "t" नहीं होता है conversion_sign_ups खेत। अंतिम पैटर्न मैच विफल हो जाएगा, जिससे पूरा पैटन मैच विफल हो जाएगा। यहाँ आपके लिए समाधान है।

val result = for {
JObject(data) <- json \ "data"
JField("id", JString(id)) <- data
JField("promoted_tweet_timeline_card_engagements",
JArray(promoted_tweet_timeline_card_engagements)) <- data
JField("promoted_account_follow_rate",
JArray(promoted_account_follow_rate)) <- data
// try to get the conversion_sign_ups field value
signUpOpt = data.find(_._1 == "conversion_sign_ups").map(_._2)
} yield {
Campaign(
id = id,
promoted_tweet_timeline_card_engagements = promoted_tweet_timeline_card_engagements,
promoted_account_follow_rate = promoted_account_follow_rate,
conversion_sign_ups = signUpOpt.flatMap {
case JArray(conversion_sign_ups) => Some(conversion_sign_ups)
case _ => None
}
)
}

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

आप उसे बता रहे हैं कि यदि सभी शर्तें पूरी होती हैं, तो एक अभियान चलाएं। यदि अंतिम नहीं है, तो कुछ भी नहीं है। आपको शायद उस विशेष क्षेत्र को अलग से संसाधित करना चाहिए:

val out = for {
JObject(data) <- json \ "data"
JField("id", JString(id)) <- data
JField("promoted_tweet_timeline_card_engagements", JArray(promoted_tweet_timeline_card_engagements)) <- data
JField("promoted_account_follow_rate", JArray(promoted_account_follow_rate)) <- data
} yield {

val conversion_sign_ups = (json \ "conversion_sign_ups") match {
case JArray(sign_ups) => Some(sign_ups)
case _ => None
}

Campaign(
id,
promoted_tweet_timeline_card_engagements,
promoted_account_follow_rate,
conversion_sign_ups
)
}