0

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?

John M
  • 1,469
  • 17
  • 41

1 Answers1

-1

You can create a JSONObject from a String using the constructor:

 JSONObject json = new JSONObject(myString);

And to convert your JSONObject to a String, just use the toString() method:

 String myString = json.toString();

Additionally, if you are trying to get a specific String value from the JSONObject, you can do this:

 if (json.has("content"))
{
    String content = json.getString("content");
    //do something with content string
}

Finally, if you aren't very comfortable using JSONObject, I recommend using the tools provided by droidQuery to help you parse, such as:

Object[] array = $.toArray(myJSONArray);

and

Map<String, ?> map = $.map(myJSONObject);
Amit Sharma
  • 1,088
  • 1
  • 19
  • 44
  • Yes, I know there are multiple alternative JSON APIs which I can use. The requirement is to stick with something that is idiomatic to Scala and can serialize/deserialize entire case class graphs (like json4s does - when it works right). – John M Nov 13 '14 at 08:00
  • @JohnM, so you want to serialize a specific class to JSON – Amit Sharma Nov 13 '14 at 08:01
  • I want json4s to work as documented in http://json4s.org/ for my Android app. The case class graphs to be serialized will very significantly. – John M Nov 13 '14 at 08:02