Java Scala:ArrayBuffer/ArrayList的Json表示。。。如何避免打印出集合中的空信息?
我的Scala类中有一个ArrayBuffer(如果使用Java,则有点像ArrayList)。以下是我的代码: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
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)
任何解决方案??