Java Scala:ArrayBuffer/ArrayList的Json表示。。。如何避免打印出集合中的空信息?

Java Scala:ArrayBuffer/ArrayList的Json表示。。。如何避免打印出集合中的空信息?,java,json,scala,Java,Json,Scala,我的Scala类中有一个ArrayBuffer(如果使用Java,则有点像ArrayList)。以下是我的代码: class MyClass { val names: ArrayBuffer[Name] = new ArrayBuffer[Name] var phone: String = null; def toJsonString(): String = { return (new GsonBuilder().serializeNulls().create()).to

我的Scala类中有一个ArrayBuffer(如果使用Java,则有点像ArrayList)。以下是我的代码:

class MyClass {

  val names: ArrayBuffer[Name] = new ArrayBuffer[Name]
  var phone: String = null;

  def toJsonString(): String = {
    return (new GsonBuilder().serializeNulls().create()).toJson(this);
  }

  override def toString(): String = {
    return toJsonString();
  }
}
然后,当我尝试打印MyClass对象时:

  var myObj = new MyClass

  val name = new Name()
  name.setFirstName("John")
  name.setLastName("Smith")

  myObj.names.append(name)

  println(myObj.toString())

然后,我的输出如下所示:

{"names":{"initialSize":16,"array":[{"firstName":"John","middleName":null,"lastName":"Smith"},null,null,null,null,null,n
ull,null,null,null,null,null,null,null,null,null],"size0":1},"phone":null}
有没有一种方法可以使输出JSON如下所示?可能使用ArrayBuffer以外的其他集合?谢谢

{"names":[{"firstName":"John","middleName":null,"lastName":"Smith"}],"phone":null}
试试这个代码

package yourPackage

import play.api.Play.current
import play.api.libs.json._
import scala.language.postfixOps
import scala.collection.mutable.ArrayBuffer

case class MyUser(names:Array[MyUserData],phone:String)
case class MyUserData(firstName:String,middleName:String,lastName:String)

class test{
      implicit val dataMyUserData = new Writes[MyUserData] {
    def writes(q: MyUserData): JsValue = {
      Json.obj(
        "firstName" -> q.firstName,
        "middleName" -> q.middleName,
        "lastName"->q.lastName
      )
    }
  }
     implicit val datamyUser = new Writes[MyUser] {
    def writes(q: MyUser): JsValue = {
      Json.obj(
        "names" -> q.names,
        "phone" -> q.phone
      )
    }
  }

    //Call this class it will return json string as you want
    def converttoJson(users:Array[MyUser])={
        println(Json.toJson(users).toString)
    }
}
调用converttoJson方法

如果您想知道如何将数据添加到此对象,请点击此处

 var ar = ArrayBuffer[MyUserData]()
     ar+=MyUserData("John","tt","fb")

 var arr = ArrayBuffer[MyUser]()
     arr+=MyUser(ar.toArray,"12345")

  test.converttoJson(arr)
试试这个代码

package yourPackage

import play.api.Play.current
import play.api.libs.json._
import scala.language.postfixOps
import scala.collection.mutable.ArrayBuffer

case class MyUser(names:Array[MyUserData],phone:String)
case class MyUserData(firstName:String,middleName:String,lastName:String)

class test{
      implicit val dataMyUserData = new Writes[MyUserData] {
    def writes(q: MyUserData): JsValue = {
      Json.obj(
        "firstName" -> q.firstName,
        "middleName" -> q.middleName,
        "lastName"->q.lastName
      )
    }
  }
     implicit val datamyUser = new Writes[MyUser] {
    def writes(q: MyUser): JsValue = {
      Json.obj(
        "names" -> q.names,
        "phone" -> q.phone
      )
    }
  }

    //Call this class it will return json string as you want
    def converttoJson(users:Array[MyUser])={
        println(Json.toJson(users).toString)
    }
}
调用converttoJson方法

如果您想知道如何将数据添加到此对象,请点击此处

 var ar = ArrayBuffer[MyUserData]()
     ar+=MyUserData("John","tt","fb")

 var arr = ArrayBuffer[MyUser]()
     arr+=MyUser(ar.toArray,"12345")

  test.converttoJson(arr)

您有很多好的选择(例如,使用另一个序列化库而不是Gson,使用不可变集合等),但这里有一个解决方案,可以将代码更改降至最低

为ArrayBuffer添加自定义序列化程序,将其转换为不可变的
数组
,从而消除空单元格:

import com.google.gson._
import scala.reflect.ClassTag
import java.lang.reflect.Type

class ArrayBufferSerializer[T : ClassTag] extends JsonSerializer[ArrayBuffer[T]] {
    override def serialize(src: ArrayBuffer[T], typeOfSrc: Type, context: JsonSerializationContext): JsonElement = {
        context.serialize(src.toArray)
    }
}
然后在
MyClass.toJsonString
中的GsonBuilder中注册它:

def toJsonString(): String = {
  new GsonBuilder()
    .registerTypeAdapter(classOf[ArrayBuffer[Name]], new ArrayBufferSerializer[Name]())
    .serializeNulls()
    .create()
    .toJson(this)
}
这将产生您想要的结果:

{"names":[{"firstName":"John","middleName":null,"lastName":"Smith"}],"phone":null}

您有很多好的选择(例如,使用另一个序列化库而不是Gson,使用不可变集合等),但这里有一个解决方案,可以将代码更改降至最低

为ArrayBuffer添加自定义序列化程序,将其转换为不可变的
数组
,从而消除空单元格:

import com.google.gson._
import scala.reflect.ClassTag
import java.lang.reflect.Type

class ArrayBufferSerializer[T : ClassTag] extends JsonSerializer[ArrayBuffer[T]] {
    override def serialize(src: ArrayBuffer[T], typeOfSrc: Type, context: JsonSerializationContext): JsonElement = {
        context.serialize(src.toArray)
    }
}
然后在
MyClass.toJsonString
中的GsonBuilder中注册它:

def toJsonString(): String = {
  new GsonBuilder()
    .registerTypeAdapter(classOf[ArrayBuffer[Name]], new ArrayBufferSerializer[Name]())
    .serializeNulls()
    .create()
    .toJson(this)
}
这将产生您想要的结果:

{"names":[{"firstName":"John","middleName":null,"lastName":"Smith"}],"phone":null}

如果从调用中删除
.serializeNulls()
,会怎么样?在我看来,你的
ArrayBuffer
被GSON处理得有点过于字面化,它序列化了其中所有的预分配值……我需要它,因为我希望“phone”:null按现在的方式打印,而不是被忽略。你必须使用GSON吗?您尝试过Jackson吗?如果您从通话中删除
.serializeNulls()
,会怎么样?在我看来,你的
ArrayBuffer
被GSON处理得有点过于字面化,它序列化了其中所有的预分配值……我需要它,因为我希望“phone”:null按现在的方式打印,而不是被忽略。你必须使用GSON吗?你试过Jackson吗?嗨,我试过按照上面的建议添加ArrayBufferSerializer类,但后来我收到投诉说找不到ClassTag和JsonSerializer。我应该为ClassTag和JsonSerializer导入哪些附加库?谢谢没有额外的库,只需再导入两个:
import com.google.gson.\u
import scala.reflect.ClassTag
-添加到AnswerThank!现在它抱怨找不到类型。。。我还应该导入什么?抱歉-现在添加回答,它是
java.lang.reflect.Type
(如果您使用的是任何IDE,它应该能够建议正确的导入…@TzachZohar我尝试了您的解决方案,但在
context.serialize(src.toArray)获得
java.lang.ArrayStoreException:com.test.TestBean
有什么解决方案吗?您好,我尝试按照上面的建议添加ArrayBufferSerializer类,但后来收到投诉说找不到ClassTag和JsonSerializer。我应该为ClassTag和JsonSerializer导入哪些附加库?谢谢没有额外的库,只需再导入两个:
import com.google.gson.\u
import scala.reflect.ClassTag
-添加到AnswerThank!现在它抱怨找不到类型。。。我还应该导入什么?抱歉-现在添加回答,它是
java.lang.reflect.Type
(如果您使用任何IDE,它应该能够建议正确的导入…@TzachZohar我尝试了您的解决方案,但得到了
java.lang.ArrayStoreException:com.test.TestBean
context.serialize(src.toArray)
任何解决方案??