2011-11-16 2 views
0

tous! J'essaye de créer le service de Web de repos avec Lift et Scala, qui obtient des résultats de MOngoDB avec des fonctions de réduction de carte. Donc par exemple ceci est ma fonction de service:Lift JsonResponse String rétro-éclairé

val map ="""function map(){ 
filteredDur= []; 
this."""+sendername+""".forEach(function (s){ 
    if (s.start > new ISODate(""""+ timestamp +""":00.00+02:00")){ 
    filteredDur.push(s); 
    } 
}); 
filteredDur.sort(function(a,b) { 
    return a.start-b.start 
}) 
emit(this._id, {After: filteredDur}); 
}""" 

val reduce = "function(key, values) { return values[0]; }" 
val mr = MapReduceCommand(mongoColl.getName(), map, reduce, MapReduceInlineOutput, None, None, None, None) 
val result = mongoColl.mapReduce(mr) 
var temp = result.toString() 
    //here some transformations of map_reduce result like getting read of map_reduce  //comments 
return JString(temp); 

serve { //this are Lift's RestHelper methods 
case Req("sendungen" :: "sendungen" ::Nil, suffix, GetRequest) => getAllSendungen() 
} 

J'utilise RestHelper dans Lift. le problème est que je ne suis pas valide JSON :(Je reçois toutes les citations backslashés. Résultat:

{ \"desc\" : \"\" , \"duration\" : 30 , \"start\" : { \"$date\" : \"2010-07-13T09:30:00Z\"} , \"end\" : { \"$date\" : \"2010-07-13T10:00:00Z\"} 

et mon analyseur client ne pas analyser ce donc je veux.

{ "desc" : "" , "duration" : 30 , "start" : { "$date" : "2010-07-13T09:30:00Z"} 

Comment puis-je faire ce travail, je sais que je peux remplacer les barres obliques dans l'application cliente, mais je ne pense pas que ce soit très élégant, j'ai essayé d'utiliser des classes de cas, mais on m'a donné la même chose ici est la classe de cas:..

case class Sendung(duration:Int, subtitle:String, desc:String, image:String,  sender:String,end:java.util.Date, title:String, start:java.util.Date) { 

    def toJSON (e : Sendung) : JObject = { 
    import net.liftweb.json.JsonDSL._ 
    import net.liftweb.json.JsonAST._ 
    ("key" -> 
    ("duration" -> JInt(duration))) ~ 
    ("subtitle" -> subtitle) ~ 
    ("desc" -> desc)); 
    } 

} 
+0

que diriez-vous de formater votre code? –

+0

désolé, les guillemets de cette échelle gâchent tout :( – Nigul

Répondre

1

Résolu: Json Response.apply (net.liftweb.json.JsonParser.parse (result_string))

renvoie LiftResponse sans anti-retour. Malheureusement, JString n'a pas d'option de guillemets. c'est pourquoi cela ne fonctionnait pas

1

Nous étions confrontés à un problème similaire sur notre projet - nous devions renvoyer JSON via un objet JsonResponse. Il était en fait aussi simple que faire:

val json = ("userId" -> userId) ~ ("userToken" -> userToken) 
JsonResponse(json) 

Avec que vous obtenez bien, dans la séquence d'échappement JSON réponse. Votre analyseur côté client devrait être capable de travailler cela.

+0

J'ai eu une situation un peu différente, il n'était pas recommandé d'utiliser les noms d'attributs implicitement, ils pourraient changer, mais merci pour la réponse de toute façon!;) – Nigul