I'm serializing a case class graph to JSON in an Android Scala app (using "com.hanhuy.sbt" % "android-sdk-plugin" % "1.3.5"
).
I'm using "org.json4s" %% "json4s-native" % "3.2.10"
, and it fails even with a simple case class which looks like this:
package test
case class Test(text: String)
The code to actually serialize looks like this:
import org.json4s._
import org.json4s.native.Serialization
import org.json4s.native.Serialization.{read, write}
// ...
implicit val formats = Serialization.formats(NoTypeHints)
val test = Test("test")
val serialized = write(test)
info(s"Serialized to '$serialized'")
The output is:
Serialized to '{}'
I suspect a ProGuard problem and my ProGuard settings in build.sbt
are like this:
proguardScala in Android := true
proguardOptions in Android ++= Seq(
"-dontobfuscate",
"-dontoptimize",
"-keepattributes Signature",
"-dontwarn scala.collection.**", // required from Scala 2.11.3
"-dontwarn scala.collection.mutable.**", // required from Scala 2.11.0
"-ignorewarnings",
"-keep class scala.Dynamic",
"-keep class test.**"
)
I tried also with json4s-jackson
but it made no difference.
The ProGuard log looks like this:
Warning: com.thoughtworks.paranamer.AnnotationParanamer$Jsr330Helper: can't find referenced class javax.inject.Named
Warning: com.thoughtworks.paranamer.AnnotationParanamer$Jsr330Helper: can't find referenced class javax.inject.Named
Warning: org.joda.convert.JDKStringConverter$9: can't find referenced class javax.xml.bind.DatatypeConverter
Warning: org.joda.convert.JDKStringConverter$9: can't find referenced class javax.xml.bind.DatatypeConverter
Warning: org.joda.convert.JDKStringConverter$9: can't find referenced class javax.xml.bind.DatatypeConverter
Note: com.google.android.gms.internal.av calls '(com.google.ads.mediation.MediationAdapter)Class.forName(variable).newInstance()'
Note: com.google.android.gms.maps.internal.q: can't find dynamically referenced class com.google.android.gms.maps.internal.CreatorImpl
Note: org.joda.time.DateTimeZone calls '(org.joda.time.tz.Provider)Class.forName(variable).newInstance()'
Note: org.joda.time.DateTimeZone calls '(org.joda.time.tz.NameProvider)Class.forName(variable).newInstance()'
Note: there were 1 unresolved dynamic references to classes or interfaces.
You should check if you need to specify additional program jars.
(http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclass)
Note: there were 3 class casts of dynamically created class instances.
You might consider explicitly keeping the mentioned classes and/or
their implementations (using '-keep').
(http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclasscast)
Warning: there were 5 unresolved references to classes or interfaces.
You may need to add missing library jars or update their versions.
If your code works fine without the missing classes, you can suppress
the warnings with '-dontwarn' options.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
Note: You're ignoring all warnings!
Any ideas?
You can create a JSONObject from a String using the constructor:
And to convert your JSONObject to a String, just use the toString() method:
Additionally, if you are trying to get a specific String value from the JSONObject, you can do this:
Finally, if you aren't very comfortable using JSONObject, I recommend using the tools provided by droidQuery to help you parse, such as:
and