2017-07-03 63 views
1

我忙於開發通過json web服務發送地圖(以及其他不相關的值)的函數,但問題是它在接收端看到它作爲JSONObject(使用getClass()方法),因此它會爲對象添加額外的屬性,從而導致服務返回錯誤。因此,在發送端地圖的println的是這樣的:Groovy/Grails - Json web服務,帶有額外屬性的地圖

[21:{adultValue=1, kidValue=0}, 11:{adultValue=0, kidValue=4}] 

但像這樣在接收端它的println的:

[11:[metaPropertyValues:[[name:adultValue, modifiers:1, type:java.lang.Object], [name:kidValue, modifiers:1, type:java.lang.Object]], properties:[kidValue:4, adultValue:0]], 21:[metaPropertyValues:[[name:adultValue, modifiers:1, type:java.lang.Object], [name:kidValue, modifiers:1, type:java.lang.Object]], properties:[kidValue:0, adultValue:1]]] 

所以在接收端有代碼,執行以下操作(簡化這個問題):

map.each { key, value -> 
    def adultValue = value.adultValue.toInteger() 
} 

但它顯然拋出根據接收方沒有map.adultValue一個空指針異常堂妹,只起了map.properties.adultValue

所以我的問題是,我可以做什麼在發送方,使接收方收到它的方式發送?我不允許更改接收方的代碼,但我可以查看輸出。

對於額外的澄清,這是我在發送端使用的代碼,以使Web服務調用:

def addAddons(map, anotherVar1, anotherVar2) { 
    println(map) // outputs the map as shown above 
    try { 
     def result 
     def http = new HTTPBuilder("the real url, not shown here") 
     http.request(Method.POST, groovyx.net.http.ContentType.JSON) { req -> 
      body = [anotherVar1: anotherVar1, anotherVar2: anotherVar2, map: map] 
      response.success = { resp, json -> 
       result = json 
      } 
     } 
     println("result: ${result}") 
     return result 
    } catch (all) { 
     all.printStackTrace() 
     return null 
    } 
} 

請讓我知道如果有什麼我需要添加

回答

1

你也可能會考慮使用JSON轉換器,因此您仍然可以創建地圖並從地圖中創建字符串。

import groovy.json.JsonOutput 

def json = JsonOutput.toJson(map) 
+0

你的回答比我的好多了,你得票xD – PrintlnParams

0

原來我看着這一切都錯了。我沒有意識到,但我應該發送一個Json對象,而不是其他任何東西,這就是爲什麼地圖不起作用,也不是一個Arraylist(我也試過,沒有在我的問題中顯示)。所以,我試圖將其轉換爲使用groovy.json.JsonBuilder到JSON,但我不能明白這一點,所以我結束了手動轉換我的地圖下面的代碼JSON:

def json = '{' 
def counter = 0 
map.each { key, value -> 
    if(counter == map.size()-1) { 
     json += "\"$key\":{\"adultValue\":${value.adultValue},\"kidValue\":${value.kidValue}}" 
    } else { 
     json += "\"$key\":{\"adultValue\":${value.adultValue},\"kidValue\":${value.kidValue}}," 
    } 
     counter++ 
} 
json += '}' 

這解決了我的問題

相關問題