在列表中追加值,然后作为JSON对象发送

时间:2014-09-08 12:42:10

标签: json scala

    var jsonElements = List[String]()
    val params = Map("host"->host)
    for((key,value)<-mapSql){
      val map = Map("metric"->key,"timestamp"->new Date().getTime,"value"->value,"tags"->params)
       jsonElements=JsonUtility.toJSONString(map) :: jsonElements

    }


    val entity = new StringEntity(JsonUtility.toJSONString(jsonElements))
    println("json elements final list is "+jsonElements)
    println("json elements final JSON Obj is "+JsonUtility.toJSONString(jsonElements))
    entity.setContentType(new BasicHeader("Content-Type", "application/json"))
    val postRequest: HttpPost = new HttpPost(putURL)
    postRequest.setEntity(entity)
    val postResponse: CloseableHttpResponse = httpclient.execute(postRequest)

我基本上需要将值添加到列表中,然后将它们一起发送到JSON数组中。 然而,这会在输出中引入不必要的转义字符“/”,这使得帖子请求变得无用,并且我在API命中时遇到错误。以下是回复:

json elements final list is List({"metric":"replicationLag","timestamp":1410179907871,"value":0.0,"tags":{"host":"tg-em-db01.nm.xxxx.com"}}, {"metric":"status","timestamp":1410179907824,"value":1,"tags":{"host":"tg-em-db01.nm.xxxxx.com"}})
json elements final JSON Obj is ["{\"metric\":\"replicationLag\",\"timestamp\":1410179907871,\"value\":0.0,\"tags\":{\"host\":\"tg-em-db01.nm.xxxx.com\"}}","{\"metric\":\"status\",\"timestamp\":1410179907824,\"value\":1,\"tags\":{\"host\":\"tg-em-db01.nm.xxxxx.com\"}}"]

我可以用replaceAll函数替换和删除所有转义字符,但我不想这样做。是否有更好的方法将对象附加到已经存在的JSON对象,然后将其更改为数组(我可以通过新的JsonArray(List(JsonObj))轻松地做到这一点,这样我就不会在任何地方获得任何转义字符。

这样的事情:

    val params = Map("host"->host)
    var map = Map[String,Any]()
    for((key,value)<-mapSql){
      map ++= Map("metric"->key,"timestamp"->new Date().getTime,"value"->value,"tags"->params)
    }

    val entity = new StringEntity(JsonUtility.toJSONString(List(map)))
    println("json elements final list is "+map)
    println("json elements final JSON Obj is "+JsonUtility.toJSONString(List(map)))

将此视为输出:

json elements final list is Map(metric -> replicationLag, timestamp -> 1410180939983, value -> 0.0, tags -> Map(host -> tg-em-db01.nm.xxxx.com))
json elements final JSON Obj is [{"metric":"replicationLag","timestamp":1410180939983,"value":0.0,"tags":{"host":"tg-em-db01.nm.xxxxx.com"}}]

但我需要这样的事情:

[ {"metric":blah blah} , {"metric":blah blah} ]

有没有办法追加到地图,以便相同的键值不会被分组?

先谢谢!

1 个答案:

答案 0 :(得分:0)

var jsonElements = List[Map[String, Any]]()
    val params = Map("host" -> host)
    for ((key, value) <- mapSql) {
      val map = Map("metric" -> key, "timestamp" -> new Date().getTime, "value" -> value, "tags" -> params)
      jsonElements = map :: jsonElements
}
val entity = new StringEntity(JsonUtility.toJSONString(jsonElements))
entity.setContentType(new BasicHeader("Content-Type", "application/json"))
val postRequest: HttpPost = new HttpPost(putURL)
postRequest.setEntity(entity)
val postResponse: CloseableHttpResponse = httpclient.execute(postRequest)

object JsonUtility {

 def toJSONString(obj:Any):String = {
    compact(JsonAST.render(decompose(obj)))
  }
}