From 7b83533249d6cbb20e5491a3f11f0305c645ec20 Mon Sep 17 00:00:00 2001 From: Yves Fischer Date: Tue, 26 Jan 2016 00:59:23 +0100 Subject: cleanup --- .../yvesf/classifieds/ClassifiedParserMain.groovy | 87 ---------------------- .../org/xapek/yvesf/classifieds/Dumper.groovy | 6 +- .../groovy/org/xapek/yvesf/classifieds/Main.groovy | 65 ++++++++++++++++ .../org/xapek/yvesf/classifieds/Model.groovy | 84 ++++++++------------- .../org/xapek/yvesf/classifieds/util/Fail.groovy | 31 ++++---- .../xapek/yvesf/classifieds/util/Failable.groovy | 14 ---- .../org/xapek/yvesf/classifieds/util/Failable.java | 19 +++++ .../classifieds/util/ParserStaticMethods.groovy | 43 +++++++++++ .../xapek/yvesf/classifieds/util/Success.groovy | 34 ++++++--- .../org/xapek/yvesf/classifieds/UnitTest.groovy | 47 ++++++++++++ .../org/xapek/yvesf/classifieds/test.json | 1 + 11 files changed, 247 insertions(+), 184 deletions(-) delete mode 100644 src/main/groovy/org/xapek/yvesf/classifieds/ClassifiedParserMain.groovy create mode 100644 src/main/groovy/org/xapek/yvesf/classifieds/Main.groovy delete mode 100644 src/main/groovy/org/xapek/yvesf/classifieds/util/Failable.groovy create mode 100644 src/main/groovy/org/xapek/yvesf/classifieds/util/Failable.java create mode 100644 src/main/groovy/org/xapek/yvesf/classifieds/util/ParserStaticMethods.groovy create mode 100644 src/test/groovy/org/xapek/yvesf/classifieds/UnitTest.groovy create mode 100644 src/test/resources/org/xapek/yvesf/classifieds/test.json (limited to 'src') diff --git a/src/main/groovy/org/xapek/yvesf/classifieds/ClassifiedParserMain.groovy b/src/main/groovy/org/xapek/yvesf/classifieds/ClassifiedParserMain.groovy deleted file mode 100644 index 499a37a..0000000 --- a/src/main/groovy/org/xapek/yvesf/classifieds/ClassifiedParserMain.groovy +++ /dev/null @@ -1,87 +0,0 @@ -package org.xapek.yvesf.classifieds - -import groovy.json.JsonSlurper -import groovyx.net.http.HTTPBuilder -import org.apache.http.HttpResponse -import org.xapek.yvesf.classifieds.util.Fail -import org.xapek.yvesf.classifieds.util.Failable -import org.xapek.yvesf.classifieds.util.Success - -class ClassifiedParserMain { - static final url = 'http://www.glocals.com/classifieds/housing-and-real-estate/&get_classified_flats' - - static void main(String[] args) { - handleData(args.length == 1 ? readJsonFile(args.first()) : readNetwork()).with { - if (it instanceof Fail) { - println "Failed: ${it.error}" - System.exit(1) - } else { - Dumper.dump(it.value, new PrintWriter(System.out)) - System.exit(0) - } - } - } - - static Object readJsonFile(String f) { - final jsonParser = new JsonSlurper() - return jsonParser.parse(new File(f)) - } - - static Object readNetwork() { - final http = new HTTPBuilder(url) - final jsonParser = new JsonSlurper() - http.post( - body: ['start': '20', 'limit': '20', 'form[bl_city_network]': '-1'], - headers: ['User-Agent': 'Mozilla/5.0 Firefox/3.0.4', - 'Accept' : 'application/json']) { HttpResponse resp -> - assert resp.statusLine.statusCode < 300 && resp.statusLine.statusCode >= 200: - "HTTP Request failed with status code ${resp.statusLine.statusCode}" - return jsonParser.parse(resp.entity.content) - } as Object - } - - private static Failable handleData(Object p) { - expectMap(p) << { Map m -> - getOrFail(m, 'totalCount', Number) << { Number totalCount -> - getOrFail(m, 'classifieds', List) << { List rawClassifieds -> - all(rawClassifieds.collect { handleClassified(it) }) << { List classifieds -> - final Model.ClassifiedList classifiedList = new Model.ClassifiedList(totalCount: totalCount) - classifiedList.addAll(classifieds) - return new Success(classifiedList) - } - } - } - } - } - - private static Failable handleClassified(Object p) { - expectMap(p) << { Map map -> - return new Success(new Model.Classified(map)) // here I cheat a bit - } - } - - static Failable> all(Collection> values) { - if (values.every { it.success }) { - return new Success>(values.collect { it.value }) - } else { - return new Fail("Not all values are successful, first error: ${values.find { !it.success }.error}") - } - } - - static Failable expectMap(Object data) { - if (data instanceof Map) return new Success(data) - else return new Fail('object is not instanceof Map') - } - - static Failable getOrFail(Map map, String key, Class clazz = Object) { - if (!map.containsKey(key)) return new Fail('key not in map') - else { - final x = map.get(key) - if (clazz.isAssignableFrom(x.getClass())) { - return new Success(x as T) - } else { - return new Fail("Key ${key} found but not of type ${clazz}") - } - } - } -} diff --git a/src/main/groovy/org/xapek/yvesf/classifieds/Dumper.groovy b/src/main/groovy/org/xapek/yvesf/classifieds/Dumper.groovy index 884166d..5fb0568 100644 --- a/src/main/groovy/org/xapek/yvesf/classifieds/Dumper.groovy +++ b/src/main/groovy/org/xapek/yvesf/classifieds/Dumper.groovy @@ -1,11 +1,11 @@ package org.xapek.yvesf.classifieds import groovy.xml.MarkupBuilder -import org.xapek.yvesf.classifieds.Model.ClassifiedList +import org.xapek.yvesf.classifieds.Model.ClassifiedsList class Dumper { - static dump(ClassifiedList classifiedList, PrintWriter writer) { + static dump(ClassifiedsList classifiedList, PrintWriter writer) { new MarkupBuilder(writer).root { rss(version: '2.0') { channel { @@ -15,7 +15,7 @@ class Dumper { item { title("${classified.type} - ${classified.title} - ${classified.composedLocation}") guid(classified.id) - author(classified.memberName) + author(classified.mem_name) description(classified.description) } } diff --git a/src/main/groovy/org/xapek/yvesf/classifieds/Main.groovy b/src/main/groovy/org/xapek/yvesf/classifieds/Main.groovy new file mode 100644 index 0000000..23fb434 --- /dev/null +++ b/src/main/groovy/org/xapek/yvesf/classifieds/Main.groovy @@ -0,0 +1,65 @@ +package org.xapek.yvesf.classifieds + +import groovy.json.JsonSlurper +import groovy.transform.CompileStatic +import groovyx.net.http.HTTPBuilder +import org.apache.http.HttpResponse +import org.xapek.yvesf.classifieds.util.Failable + +import static org.xapek.yvesf.classifieds.util.ParserStaticMethods.* + +@CompileStatic +final class Main { + private final static JsonSlurper jsonParser = new JsonSlurper() + + private final static url = 'http://www.glocals.com/classifieds/housing-and-real-estate/&get_classified_flats' + + static void main(String[] args) { + final data = handleData( + args.length == 1 ? + readInputStream(new FileInputStream(args[0])) : readNetwork()); + if (data.isSuccess()) { + Dumper.dump(data.getValue(), new PrintWriter(System.out)); + System.exit(0); + } else { + System.out.println("Failed: " + data.errorTrace.join(' -> ')) + System.exit(1); + } + } + + static Object readInputStream(InputStream is) { + return jsonParser.parse(is) + } + + static Object readNetwork() { + final http = new HTTPBuilder(url) + http.post( + body: ['start': '20', 'limit': '20', 'form[bl_city_network]': '-1'], + headers: ['User-Agent': 'Mozilla/5.0 Firefox/3.0.4', + 'Accept' : 'application/json']) { HttpResponse resp -> + assert resp.statusLine.statusCode < 300 && resp.statusLine.statusCode >= 200: + "HTTP Request failed with status code ${resp.statusLine.statusCode}" + return jsonParser.parse(resp.entity.content) + } as Object + } + + static Failable handleData(Object object) { + ifType(object, Map) then { Map m -> + ifField(m, 'totalCount', Number) then { Number totalCount -> + ifField(m, 'classifieds', List) then { List rawClassifieds -> + all(rawClassifieds.collect { handleClassified(it) }) then { List classifieds -> + final classifiedList = new Model.ClassifiedsList(totalCount: totalCount) + classifiedList.addAll(classifieds) + success(classifiedList) + } + } + } + } + } + + private static Failable handleClassified(Object p) { + ifType(p, Map) then { Map map -> + success(new Model.Classified(map)) + } + } +} \ No newline at end of file diff --git a/src/main/groovy/org/xapek/yvesf/classifieds/Model.groovy b/src/main/groovy/org/xapek/yvesf/classifieds/Model.groovy index ee0b11d..cd62c25 100644 --- a/src/main/groovy/org/xapek/yvesf/classifieds/Model.groovy +++ b/src/main/groovy/org/xapek/yvesf/classifieds/Model.groovy @@ -1,5 +1,8 @@ package org.xapek.yvesf.classifieds +import groovy.transform.CompileStatic + +@CompileStatic class Model { static class Classified { //0 = available" -> "Flexible" @@ -32,67 +35,38 @@ class Model { //27 ="title_js" -> "Fully furnished house of 270 sqm and huge terrace of 90 sqm" //28 ="type" -> "Apts / Housing for rent" //29 ="views" -> "8" - private Map map - - Classified(Map m) { - this.@map = m - } - - Map getMap() { - return map + String available + String location + String city + String type + String price + String currency + String views + String title + String id + String mem_name + String description + + Classified(Map map) { + metaClass.properties.each { MetaProperty property -> + if (map.containsKey(property.name)) { + final value = map.get(property.name) + if (property.type.isAssignableFrom(value.getClass())) { + property.setProperty(this, value) + } else { + throw new IllegalArgumentException("Cannot set field ${property.name} with object of type ${value.getClass()}") + } + } + } } String getComposedLocation() { - return "${map.get('location')}, ${map.get('city')}" - } - - String getType() { - return map.get('type') as String - } - - String getAvailable() { - return map.get('available') as String - } - - String getCity() { - return map.get('city') - } - - String getPrice() { - return map.get('price') as String - } - - String getCurrency() { - return map.get('currency') as String - } - - String getViews() { - return map.get('views') as String - } - - String getTitle() { - return map.get('title') as String - } - - String getId() { - return map.get('id') as String - } - - String getMemberName() { - return map.get('mem_name') as String - } - - String getDescription() { - return map.get('description') as String + return "${location}, ${city}" } } - static class ClassifiedList extends ArrayList { - private long totalCount - - void setTotalCount(long totalCount) { - this.@totalCount = totalCount - } + static class ClassifiedsList extends ArrayList { + long totalCount @Override String toString() { diff --git a/src/main/groovy/org/xapek/yvesf/classifieds/util/Fail.groovy b/src/main/groovy/org/xapek/yvesf/classifieds/util/Fail.groovy index c58d6ef..b514385 100644 --- a/src/main/groovy/org/xapek/yvesf/classifieds/util/Fail.groovy +++ b/src/main/groovy/org/xapek/yvesf/classifieds/util/Fail.groovy @@ -3,19 +3,15 @@ package org.xapek.yvesf.classifieds.util import groovy.transform.CompileStatic import groovy.transform.ToString - @CompileStatic -@Newify @ToString(includeFields = true, includeNames = true) -class Fail implements Failable { - private String error - - Fail() { - this.@error = null - } +class Fail implements Failable.FailableImpl { + private List errorTrace = new ArrayList<>() - Fail(String error) { - this.@error = error; + protected Fail(String step) { + if (step) { + prependTrace(step) + } } @Override @@ -24,17 +20,22 @@ class Fail implements Failable { } @Override - Object getValue() { + T getValue() { return null } @Override - String getError() { - return error + public Failable then(Closure> closure) { + return this } @Override - def Failable leftShift(Closure> closure) { - return null + List getErrorTrace() { + return errorTrace + } + + @Override + void prependTrace(String p) { + errorTrace.add(0, p) } } diff --git a/src/main/groovy/org/xapek/yvesf/classifieds/util/Failable.groovy b/src/main/groovy/org/xapek/yvesf/classifieds/util/Failable.groovy deleted file mode 100644 index 4ad5e90..0000000 --- a/src/main/groovy/org/xapek/yvesf/classifieds/util/Failable.groovy +++ /dev/null @@ -1,14 +0,0 @@ -package org.xapek.yvesf.classifieds.util - -import groovy.transform.CompileStatic - -@CompileStatic -interface Failable { - boolean isSuccess() - - T getValue() - - String getError() - - public Failable leftShift(Closure> closure); -} \ No newline at end of file diff --git a/src/main/groovy/org/xapek/yvesf/classifieds/util/Failable.java b/src/main/groovy/org/xapek/yvesf/classifieds/util/Failable.java new file mode 100644 index 0000000..2e1b780 --- /dev/null +++ b/src/main/groovy/org/xapek/yvesf/classifieds/util/Failable.java @@ -0,0 +1,19 @@ +package org.xapek.yvesf.classifieds.util; + +import groovy.lang.Closure; + +import java.util.List; + +public interface Failable { + boolean isSuccess(); + + T getValue(); + + Failable then(Closure> closure); + + List getErrorTrace(); + + interface FailableImpl extends Failable { + void prependTrace(String p); + } +} diff --git a/src/main/groovy/org/xapek/yvesf/classifieds/util/ParserStaticMethods.groovy b/src/main/groovy/org/xapek/yvesf/classifieds/util/ParserStaticMethods.groovy new file mode 100644 index 0000000..15524c8 --- /dev/null +++ b/src/main/groovy/org/xapek/yvesf/classifieds/util/ParserStaticMethods.groovy @@ -0,0 +1,43 @@ +package org.xapek.yvesf.classifieds.util + +import groovy.transform.CompileStatic +import org.xapek.yvesf.classifieds.util.Fail +import org.xapek.yvesf.classifieds.util.Failable +import org.xapek.yvesf.classifieds.util.Success + +@CompileStatic +class ParserStaticMethods { + static Failable> all(Collection> values) { + if (values.every { it.success }) { + return success(values.collect { it.value }, "all[size=${values.size()}]") + } else { + return fail("all[firstIndex=${values.findIndexOf { Failable it -> !it.success }}," + + "firstTrace=${values.find { !it.success }.errorTrace.join(' -> ')}]") + } + } + + static Failable ifType(Object data, Class type) { + if (type.isAssignableFrom(data.getClass())) success(data as T, "iftype[${type.name}]") + else fail("iftype[${type.name}]") + } + + static Failable ifField(Map map, String key, Class clazz = Object) { + if (!map.containsKey(key)) return new Fail("ifField[notfound ${key}]") + else { + final x = map.get(key) + if (clazz.isAssignableFrom(x.getClass())) { + success(x as T, "ifField[${key}<=>${clazz}]") + } else { + fail("ifField[${key}<=>${clazz}]") + } + } + } + + static Success success(T value, String trace = null) { + return new Success(value, trace) + } + + static Fail fail(String trace = null) { + return new Fail(trace) + } +} diff --git a/src/main/groovy/org/xapek/yvesf/classifieds/util/Success.groovy b/src/main/groovy/org/xapek/yvesf/classifieds/util/Success.groovy index 224909d..9e39527 100644 --- a/src/main/groovy/org/xapek/yvesf/classifieds/util/Success.groovy +++ b/src/main/groovy/org/xapek/yvesf/classifieds/util/Success.groovy @@ -3,15 +3,15 @@ package org.xapek.yvesf.classifieds.util import groovy.transform.CompileStatic import groovy.transform.ToString - @CompileStatic -@Newify @ToString(includeFields = true, includeNames = true) -class Success implements Failable { - private T value +class Success implements Failable.FailableImpl { + final private T value + final private String step - public Success(T value) { - this.value = value + protected Success(T value, String step) { + this.@value = value + this.@step = step } @Override @@ -25,12 +25,26 @@ class Success implements Failable { } @Override - String getError() { - return null + public Failable then(Closure> closure) { + try { + final failable = closure.call(value) + if (!failable.success) { + (failable as Failable.FailableImpl).prependTrace(step) + } + return failable + } catch (Exception e) { + final failable = new Fail("exception[${e.getClass().name}]") + failable.prependTrace(step) + return failable + } + } + + @Override + List getErrorTrace() { + return [] } @Override - def Failable leftShift(Closure> closure) { - return closure.call(value) + void prependTrace(String p) { } } \ No newline at end of file diff --git a/src/test/groovy/org/xapek/yvesf/classifieds/UnitTest.groovy b/src/test/groovy/org/xapek/yvesf/classifieds/UnitTest.groovy new file mode 100644 index 0000000..7c477b4 --- /dev/null +++ b/src/test/groovy/org/xapek/yvesf/classifieds/UnitTest.groovy @@ -0,0 +1,47 @@ +package org.xapek.yvesf.classifieds + +import org.junit.Test +import org.xapek.yvesf.classifieds.util.Success + +class UnitTest { + @Test + void testRead() { + final data = Main.readInputStream(UnitTest.getResourceAsStream('test.json')) + assert data instanceof Map + } + + @Test + void testParse() { + final data = Main.handleData(Main.readInputStream(UnitTest.getResourceAsStream('test.json'))) + assert data instanceof Success + assert data.success + assert !data.error + assert data.value instanceof Model.ClassifiedsList + assert data.value.totalCount > 0 + assert data.value.size() > 0 + } + + @Test + void testDump() { + final os = new ByteArrayOutputStream() + final list = new Model.ClassifiedsList(totalCount: 100) + list.add(new Model.Classified([ + 'available' : 'value=available', + 'location' : 'value=location', + 'city' : 'value=city', + 'type' : 'value=type', + 'price' : 'value=price', + 'currency' : 'value=currency', + 'views' : 'value=views', + 'title' : 'value=title', + 'id' : 'value=id', + 'mem_name' : 'value=mem_name', + 'description': 'value=description', + ])) + Dumper.dump(list, new PrintWriter(os)) + final output = os.toString() + assert output.contains("value=city") + assert output.contains("value=title") + assert output.contains("value=description") + } +} \ No newline at end of file diff --git a/src/test/resources/org/xapek/yvesf/classifieds/test.json b/src/test/resources/org/xapek/yvesf/classifieds/test.json new file mode 100644 index 0000000..4050335 --- /dev/null +++ b/src/test/resources/org/xapek/yvesf/classifieds/test.json @@ -0,0 +1 @@ +{"classifieds":[{"available":"Mar 15, 16","city":"Geneva","column_headings":1,"contact":"","currency":"CHF","date":"Jan 25, 16","description":"I am looking for candidates to taking over my apartment in Plainpalais.
\r\n- Three pieces, 55 sqm, balcony, cave.
\r\n- Very easy access of public transportation: Tram 14, Bus 2, 11 and 19.
\r\n- Five minutes walk to Vernets Sports Center, downstairs COOP, Migros and Dener, phamacies, fleurist etc. Very dynamic area with bars, resturants and museums.
\r\n- Price: 1500 CHF a month.
\r\nIt is a price impossible in Geneva.
\r\n
\r\nThe apartment is subject for taking over, NO temporary rent.
\r\n
\r\nConditions:
\r\n- For 1 or 2 people, no kids.
\r\n- Willing to discuss and buy my furnitures ( double sized bed, fridge, sofa bed, table etc. All in good quality and good status.)
\r\n- Forecast for mid-March 2016 taking over.
\r\n
\r\nIf you are interested, please reply and introduce your situation ( job, age, ok for furniture taking over etc). I will reply asap.
\r\n
\r\nA visit can be arranged.
\r\n
\r\nThanks.","expired":0,"id":"67198","location":"","mark":"Mark / Save Ad","mem_first_name":"Yezi","mem_id":"69841","mem_link":"javascript:open_login_popup();","mem_name":"Yezi G","mem_name_js":"Yezi G","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":0,"photo2":0,"photo3":0,"photo4":0,"photos":0,"price":"1500","rooms":"3","status":null,"title":"Plainpalais 3 pieces apt taking over with furniture ( 1500CHF charges included)","title_js":"Plainpalais 3 pieces apt taking over with furniture ( 1500CHF charges included)","type":"Apts / Housing for rent","views":"20"},{"available":"Immediate","city":"Geneva","column_headings":0,"contact":"lulito35@hotmail.com","currency":"CHF","date":"Jan 25, 16","description":"Available immediately , fully furnished studio in the Rue Sautter - 1205 Geneva
\r\nExcellent location close to public, transport, lake, park and shops.
\r\nEquipped kitchen
\r\nElevator, laundry facilities in the building
\r\nCHF1.500 (including bills, electricity, telephone, Wi-Fi and TV- cleaning twice a month.)
\r\nPrefer someone working for an International Organization, no smokers, and no pets.
\r\nOne month deposit required. No smoking.","expired":0,"id":"63508","location":"Rue Sautter / 1205 Geneva","mark":"Mark / Save Ad","mem_first_name":"Luz Elena","mem_id":"68899","mem_link":"javascript:open_login_popup();","mem_name":"Luz Elena R","mem_name_js":"Luz Elena R","mem_photo":"http://cdn.glocals.com/sites/glocals/_media/members/68/68899_mem_photo_e5ac2.jpg","network":"Geneva","photo1":"/_media/board_flat1/63/63508_bl_photo_8417d.jpg","photo2":"/_media/board_flat1/63/63508_bl_photo2_b08fe.jpg","photo3":"/_media/board_flat1/63/63508_bl_photo3_bca21.jpg","photo4":"/_media/board_flat1/63/63508_bl_photo4_73643.jpg","photos":1,"price":"1500","rooms":"1","status":null,"title":"Fully furnished Central STUDIO. Available immediately - Rue Sautter - front of the hospital of Geneva,","title_js":"Fully furnished Central STUDIO. Available immediately - Rue Sautter - front of the hospital of Geneva,","type":"Apts / Housing for rent","views":"15"},{"available":"Flexible","city":"France","column_headings":0,"contact":"0795354458","currency":"CHF","date":"Jan 25, 16","description":"Fully furnished house of 270 sqm in total.
\r\n
\r\nVery nice and big house of 270sqm (included 90 sqm2 of basement) with 5 bedrooms, 2 showerooms,1 bathroom and a guest toilet. 70 sqm of closed garage. Wine cellar. Lots of storage.
\r\n
\r\nBig living/dining room with fireplace. Big kitchen all equipped.
\r\n
\r\nLaundry area and storage room.
\r\n
\r\n1000 sqm of land.
\r\n
\r\nLocated in Valleiry 20 minutes from Geneva.
\r\n
\r\n3'000 \u20ac
\r\n
\r\nCan be rent unfurnished TBD
\r\n
\r\nNo agencies, thanks!","expired":0,"id":"67199","location":"Valleiry","mark":"Mark / Save Ad","mem_first_name":"petitemanga","mem_id":"16088","mem_link":"javascript:open_login_popup();","mem_name":"petitemanga","mem_name_js":"petitemanga","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":"/_media/board_flat1/67/67199_bl_photo_eedba.jpg","photo2":"/_media/board_flat1/67/67199_bl_photo2_58cc1.jpg","photo3":"/_media/board_flat1/67/67199_bl_photo3_a5502.jpg","photo4":"/_media/board_flat1/67/67199_bl_photo4_63653.jpg","photos":1,"price":"3000","rooms":"7","status":null,"title":"Fully furnished house of 270 sqm and huge terrace of 90 sqm","title_js":"Fully furnished house of 270 sqm and huge terrace of 90 sqm","type":"Apts / Housing for rent","views":"8"},{"available":"","city":"Geneva","column_headings":0,"contact":"lulito35@hotmail.com","currency":"CHF","date":"Jan 25, 16","description":"Fully furnished room available immediately. 3 Rue de Cornavin - 1201 Geneva.
\r\nIt is fully furnished with wifi, laundry machine,kitchen and others.
\r\nOne month deposit required","expired":0,"id":"62038","location":"Rue de Cornavin 3","mark":"Mark / Save Ad","mem_first_name":"Luz Elena","mem_id":"68899","mem_link":"javascript:open_login_popup();","mem_name":"Luz Elena R","mem_name_js":"Luz Elena R","mem_photo":"http://cdn.glocals.com/sites/glocals/_media/members/68/68899_mem_photo_e5ac2.jpg","network":"Geneva","photo1":"/_media/board_flat1/62/62038_bl_photo_2d831.jpg","photo2":"/_media/board_flat1/62/62038_bl_photo2_06318.jpg","photo3":"/_media/board_flat1/62/62038_bl_photo3_9904b.jpg","photo4":"/_media/board_flat1/62/62038_bl_photo4_4a640.jpg","photos":1,"price":"950","rooms":"1","status":"\"Replied\"","title":"Fully furnished room available immediately - 3 Rue Cornavin - Geneva - Only Men","title_js":"Fully furnished room available immediately - 3 Rue Cornavin - Geneva - Only Men","type":"Apts / Housing for rent","views":"13"},{"available":"Immediate","city":"Geneva","column_headings":0,"contact":"+41786230434","currency":"CHF","date":"Jan 25, 16","description":"A very nice room in a fully furnished 4 pieces apartment to share with female flat mate.
\r\n
\r\nLOCATION: The flat is situated in Veyrier close to bus N 8 stop which connects with downtown Geneva, Cornavin, United Nations etc. It is on the third (last) floor of the building.
\r\n
\r\nTHE APARTMENT: The flat is very bright and fully furnished with all utilities (WIFI, BlueWin TV).
\r\nThe flat consists of a living room, kitchen, 2 bedrooms, balcony, bathroom, WC.
\r\nIn the basement there is a storage room, parking spot is available too. The kitchen is fully equipped with el. cooker, oven, fridge/freezer, microwave and all kitchen utilities, tableware etc. The bathroom has a bath. Washing machine and dryer are available in the basement at time of your convenience. The apartment has hardwood floors in all rooms and the corridor. The kitchen and the bathroom have tiled floors.
\r\n
\r\nTHE ROOM: The room to be rented out has about 18 square meters. The room is furnished with double bed, wardrobe, desk, chair, shelves.
\r\n
\r\nTHE RENT: CHF 1100, 2 months deposit required, 1month notice period (if the term is not fixed)
\r\n
\r\nTHE TENNANT: I am looking for a responsible and discreet person, who is interested in renting the room for a short or longer period (at least six months, preferably longer). No pets and no smoking inside, please!","expired":0,"id":"62161","location":"Veyrier","mark":"Mark / Save Ad","mem_first_name":null,"mem_id":"0","mem_link":"javascript:open_login_popup();","mem_name":"Anonymous","mem_name_js":"Anonymous","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":"/_media/board_flat1/62/62161_bl_photo_12e84.jpg","photo2":"/_media/board_flat1/62/62161_bl_photo2_23128.jpg","photo3":"/_media/board_flat1/62/62161_bl_photo3_c90e2.jpg","photo4":"/_media/board_flat1/62/62161_bl_photo4_b9abd.jpg","photos":1,"price":"999","rooms":"0","status":null,"title":"GRET DEAL 4 pieces apartment of a price of a single room.","title_js":"GRET DEAL 4 pieces apartment of a price of a single room.","type":"Apt shares / Room mates","views":"5"},{"available":"Immediate","city":"Geneva","column_headings":0,"contact":"078 818 9089","currency":"CHF","date":"Jan 25, 16","description":"Cozy, fully furnished room in a lovely Champel apartment, where I live with my two sweet tween-age children.
\r\nThis is a temporary solution, 2-3 months.
\r\nQuite often we are not here on weekends.
\r\nAvailable immediately.
\r\n800 CHF rent + 150 for the use of everything, from heat, water, electricity, high-speed internet, washer, kitchen etc.","expired":0,"id":"67127","location":"Champel","mark":"Mark / Save Ad","mem_first_name":"Zane","mem_id":"87298","mem_link":"javascript:open_login_popup();","mem_name":"Zane E","mem_name_js":"Zane E","mem_photo":"http://cdn.glocals.com/sites/glocals/_media/members/87/87298_mem_photo_67155.jpg","network":"Geneva","photo1":"/_media/board_flat1/67/67127_bl_photo_02391.jpg","photo2":"/_media/board_flat1/67/67127_bl_photo2_a61fe.jpg","photo3":"/_media/board_flat1/67/67127_bl_photo3_d2eef.jpg","photo4":0,"photos":1,"price":"800","rooms":"0","status":null,"title":"Room in Champel in family apartment - woman only","title_js":"Room in Champel in family apartment - woman only","type":"Apt shares / Room mates","views":"13"},{"available":"Immediate","city":"Geneve","column_headings":0,"contact":"","currency":"CHF","date":"Jan 25, 16","description":"Price covers all utilities, including washing-machine and WIFI. Bedding and towels provided. Fully furnished spacious bright room w/ large living-room, open kitchen, big balcony and terrace on different levels,. 15 minute walk to airport, Balexert (Shopping Center for food, clothing, movie theater....) and Balexpo (various sports grounds, exhibitions). Walk to MiGros, Denner and Coop, bus No. 3, 5, 28 and F, post office, pharmacy, nail salon, dental, gym, restaurants, parks.
\r\n
\r\nThere are 3 bedrooms. The rooms are spacious, bright and sunny (French windows). Quiet apt., building and area. 2 bath/shower/toilet rooms, roof terrace with panoramic view of the mountains and airport.
\r\n
\r\nThere is a double bed, wardrobe, desk/chair, and chest of drawers in the room.
\r\n
\r\nConvenient transport connections for all Geneva areas and France.
\r\n
\r\nClean and friendly people are welcome. Flexible terms and rates.","expired":0,"id":"60241","location":"Grand-Saconnex","mark":"Mark / Save Ad","mem_first_name":"Jen","mem_id":"35189","mem_link":"javascript:open_login_popup();","mem_name":"Jen C","mem_name_js":"Jen C","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":"/_media/board_flat1/60/60241_bl_photo_79450.jpg","photo2":"/_media/board_flat1/60/60241_bl_photo2_d386a.jpg","photo3":"/_media/board_flat1/60/60241_bl_photo3_28aea.jpg","photo4":"/_media/board_flat1/60/60241_bl_photo4_65f93.jpg","photos":1,"price":"1350","rooms":"1","status":null,"title":"Furnished-room in Duplex -- Walk to Int'l orgs., airport, Palexpo, Palexert","title_js":"Furnished-room in Duplex -- Walk to Int\\'l orgs., airport, Palexpo, Palexert","type":"Apt shares / Room mates","views":"10"},{"available":"Mar 3, 16","city":"Geneva","column_headings":0,"contact":"","currency":"CHF","date":"Jan 25, 16","description":"Rue Cramer - near Cornavin and UN. Underground in modern appt block. Direct from owner.
\r\nNo timewasters please.","expired":0,"id":"67061","location":"","mark":"Mark / Save Ad","mem_first_name":"Dominic","mem_id":"116558","mem_link":"javascript:open_login_popup();","mem_name":"Dominic L","mem_name_js":"Dominic L","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":0,"photo2":0,"photo3":0,"photo4":0,"photos":0,"price":"225","rooms":"0","status":null,"title":"SECURE - UNDERGROUND PARKING","title_js":"SECURE - UNDERGROUND PARKING","type":"Parking / Storage","views":"3"},{"available":"Feb 1, 16","city":"Geneva","column_headings":0,"contact":"","currency":"CHF","date":"Jan 25, 16","description":"Secure, locked, clean, high-tech automated indoor parking at Rue de Lausanne, close to the Mole and Butini tram stops. 200 CHF per month plus refundable 200 CHF security deposit. Available February 1 for short or long-term lease.","expired":0,"id":"66889","location":"Paquis","mark":"Mark / Save Ad","mem_first_name":"Meg","mem_id":"121266","mem_link":"javascript:open_login_popup();","mem_name":"Meg D","mem_name_js":"Meg D","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":0,"photo2":0,"photo3":0,"photo4":0,"photos":0,"price":"200","rooms":"0","status":null,"title":"Secure indoor parking near Cornavin 200 CHF/month","title_js":"Secure indoor parking near Cornavin 200 CHF/month","type":"Parking / Storage","views":"0"},{"available":"Feb 15, 16","city":"Geneva","column_headings":0,"contact":"","currency":"CHF","date":"Jan 25, 16","description":"Furnished room (bed+desk) for rent in a spacious shared apartment in Geneva. Available starting February 15th for at least two months, until April 15th, possibly longer. The rent is 1200 CHF/month which includes utilities and high speed internet.
\r\n
\r\nIt's a great apartment with a large living room and a balcony overlooking a quiet green space. The apartment itself is fully furnished, and the kitchen is also fully equipped, including a laundry machine.
\r\n
\r\nThe location is 60 Rue Rothschild, within easy walking distance of both Gare Cornavin and the lake. There are several options for grocery shopping within 5 minutes walk on Rue de Lausanne.
\r\n
\r\nThere are 2 roommates (Josh Kunkle and Mia Liu), both doing postdoctoral fellowships on CMS.
\r\n
\r\nIf you're interested in visiting the apartment and meeting Josh and Mia, please contact me (joseph.taenzer@cern.ch).","expired":0,"id":"67195","location":"","mark":"Mark / Save Ad","mem_first_name":"Joe","mem_id":"121052","mem_link":"javascript:open_login_popup();","mem_name":"Joe Taenzer","mem_name_js":"Joe Taenzer","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":0,"photo2":0,"photo3":0,"photo4":0,"photos":0,"price":"1200","rooms":"1","status":null,"title":"Furnished room for rent from Feb 15th (Geneva, 1200 CHF/month)","title_js":"Furnished room for rent from Feb 15th (Geneva, 1200 CHF/month)","type":"Sublets / Temporary","views":"15"},{"available":"Feb 1, 16","city":"Geneva","column_headings":0,"contact":"","currency":"CHF","date":"Jan 25, 16","description":"Great location, short walkt to tram 12 /18 to Cern, Wipo, Who. Bus 1 etc.
\r\nEasy walk to Unimail, or HUG.
\r\nAll towels, sheets, kitchenware are here to use while I am away.
\r\nMain room has a single bed, love seat, TV, (cable &internet wifi)
\r\nThe bathroom has toilet, sink, bathtub (with hand held shower) there are towels.
\r\n
\r\nThe love seat can be used in a pinch for a visitor. Not for regular sleeping. There is,a small vacume cleaner, and other furnatures in the flat. One small clothset for use, and a couple of drawers. 30m2 with the kitchen seperate, tiny balcony. Self service laundy accross the street, near coop & migros, Denner on ground floor.
\r\n
\r\nSafe building. This is an older apartment. 01 february . Max till mid march. 60- night. (1450-/mois )
\r\nEverything you need is here, while I am gone. A security deposit will be required, and a discreeat communicative person. Non smoker preferred. No parking. Please give me an whatsapp/tel so we can talk.
\r\n
\r\nThe flat is well heated incase tou like it warm.","expired":0,"id":"66841","location":"Augustins/Plainpalais","mark":"Mark / Save Ad","mem_first_name":"okSunshine","mem_id":"13475","mem_link":"javascript:open_login_popup();","mem_name":"okSunshine","mem_name_js":"okSunshine","mem_photo":"http://cdn.glocals.com/sites/glocals/_media/members/13/13475_mem_photo_5a6b4.jpg","network":"Geneva","photo1":"/_media/board_flat1/66/66841_bl_photo_74e42.jpg","photo2":"/_media/board_flat1/66/66841_bl_photo2_a8455.jpg","photo3":"/_media/board_flat1/66/66841_bl_photo3_be4d7.jpg","photo4":0,"photos":1,"price":"0","rooms":"2","status":null,"title":"Place Augustins 2p, great access.. Tram18/12 CERN, WHO, WIPO february. Or part","title_js":"Place Augustins 2p, great access.. Tram18/12 CERN, WHO, WIPO february. Or part","type":"Sublets / Temporary","views":"18"},{"available":"Flexible","city":"Geneva","column_headings":0,"contact":"","currency":"CHF","date":"Jan 25, 16","description":"Bedroom,separate kitchen, living room and renovated bathroom with all bills included (internet, electricity, water, heating) available in quiet neighbourhood in Eaux Vives as from beginning of February for 2,600 monthly. Close to the WEF and walking distance to Parc de la Grange, restaurants and supermarkets in Eaux-Vives. Flat has all household appliances and a washing machine. High ceilings, luminous and spacious.
\r\n2 minutes to buses 9,1,33,A (bus stop: Cuisine and tram stop Grange Canal).","expired":0,"id":"66696","location":"Eaux-Vives","mark":"Mark / Save Ad","mem_first_name":"Jade","mem_id":"50037","mem_link":"javascript:open_login_popup();","mem_name":"Jade C","mem_name_js":"Jade C","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":"/_media/board_flat1/66/66696_bl_photo_39a55.jpg","photo2":"/_media/board_flat1/66/66696_bl_photo2_e8213.jpg","photo3":"/_media/board_flat1/66/66696_bl_photo3_1d4d3.jpg","photo4":"/_media/board_flat1/66/66696_bl_photo4_6ad2a.jpg","photos":1,"price":"2600","rooms":"3","status":"\"Replied\"","title":"Stunningly furnished quiet flat in Eaux-Vives as from Feb","title_js":"Stunningly furnished quiet flat in Eaux-Vives as from Feb","type":"Sublets / Temporary","views":"18"},{"available":"Flexible","city":"Geneva","column_headings":0,"contact":"","currency":"CHF","date":"Jan 25, 16","description":"Very cozy and bright studio located in the heart of the old Carouge within a nice and quiet building.
\r\n
\r\nLively neighborhood with shops and cafes nearby. Close to all amenities and 200mt from public transport (Tram 12, 18, bus 11, 21 - Stop March\u00e9), Migros, restaurants.
\r\n
\r\nThis nice 35sqm studio offers a living room/bedroom fully furnished with equipped kitchen, large bathroom with bath tub and wooden floor. Wi-Fi and all comforts included.
\r\n
\r\nTypically looking for a professional, quiet, clean and highly respectful person with references. No parties at home.
\r\nIdeal for people looking for a calm, sunny and nice studio during weekdays.
\r\n
\r\nMonthly Rent CHF 1.480.
\r\n High Value for Money.
\r\nPrice includes:
\r\n- Water, electric, heating, WiFi and maintenance charges
\r\n- Linen and towels are provided
\r\nPreference: weekdays
\r\n
\r\nIMPORTANT
\r\nFor contact, further details and pictures or if you would like to arrange for a viewing, please include some information about yourself and your move in date in your reply.","expired":0,"id":"66885","location":"Carouge","mark":"Mark / Save Ad","mem_first_name":"Caterina","mem_id":"115798","mem_link":"javascript:open_login_popup();","mem_name":"Caterina T","mem_name_js":"Caterina T","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":"/_media/board_flat1/66/66885_bl_photo_334bf.jpg","photo2":"/_media/board_flat1/66/66885_bl_photo2_2e94c.jpg","photo3":"/_media/board_flat1/66/66885_bl_photo3_fc65b.jpg","photo4":"/_media/board_flat1/66/66885_bl_photo4_f4f25.jpg","photos":1,"price":"1480","rooms":"1","status":null,"title":"BRIGHT AND FURNISHED STUDIO - Carouge- available 01.05.16","title_js":"BRIGHT AND FURNISHED STUDIO - Carouge- available 01.05.16","type":"Sublets / Temporary","views":"17"},{"available":"Mar 1, 16","city":"Geneva","column_headings":0,"contact":"","currency":"CHF","date":"Jan 25, 16","description":"A beautiful fully furnished 4 bedroom apartment in the heart of Geneva, right across tram 15 and overlooking Plainpalais. It is completely central near all the bars and restaurants but at the same time with double glazed windows you do not hear any noise.
\r\nThe apartment is modern and brand new and the tenants are first to occupy it. It is well lit and very spacious, around 150m2. It has 1 bathroom, 1 shower and toilet and 1 powder room (just toilet), 4 bedrooms, a big size kitchen and a very open lounge and a dining area.
\r\nThere are 3 flat mates (4 in total including you), who are all working professionals in their late 20's/early 30's and are looking for a profile of someone similar, social and international. We are looking for someone to replace one of the current tenants in the lease, the setup is for 3 tenants to hold the lease and one person subletting.
\r\nThe lease agreement will offer you the fully furnished apartment, fully equipped with all appliances, etc with all charges included at a monthly rent around 1200 CHF (cleaning and bills) + some yearly fees on top for things like yearly rental deposit, and maintenance.","expired":0,"id":"67118","location":"Plainpalais","mark":"Mark / Save Ad","mem_first_name":"Ali","mem_id":"63592","mem_link":"javascript:open_login_popup();","mem_name":"Ali Malik","mem_name_js":"Ali Malik","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":"/_media/board_flat1/67/67118_bl_photo_c53bb.jpg","photo2":"/_media/board_flat1/67/67118_bl_photo2_a97ca.jpg","photo3":"/_media/board_flat1/67/67118_bl_photo3_bdb2a.jpg","photo4":"/_media/board_flat1/67/67118_bl_photo4_7477d.jpg","photos":1,"price":"1200","rooms":"4","status":"\"Replied\"","title":"Looking for a Lease Share!","title_js":"Looking for a Lease Share!","type":"Apt shares / Room mates","views":"16"},{"available":"Immediate","city":"Geneva","column_headings":0,"contact":"","currency":"CHF","date":"Jan 25, 16","description":"NGO in UN area is looking for another NGO to co-share a splendid office space in the heart of UN area.
\r\n
\r\n- Public transportation and parking available
\r\n- Price: 280 chf / square meter / year
\r\n- Available space: to be discussed. Up to 150 m2 is available depending on number of needed rooms
\r\n- Conference room, showers, kitchen
\r\n- Nearby restaurants, post office & conference center
\r\n
\r\nExceptional space in central Geneva location !","expired":0,"id":"67194","location":"","mark":"Mark / Save Ad","mem_first_name":"Valerie","mem_id":"33969","mem_link":"javascript:open_login_popup();","mem_name":"Valerie C","mem_name_js":"Valerie C","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":0,"photo2":0,"photo3":0,"photo4":0,"photos":0,"price":"0","rooms":"0","status":null,"title":"Office space available in UN area","title_js":"Office space available in UN area","type":"Office / Commercial","views":"2"},{"available":"Immediate","city":"Geneva","column_headings":0,"contact":"022 566 50 58","currency":"CHF","date":"Jan 25, 16","description":"Unique commercial 44sqm arcade to rent in Terrassiere !
\r\nTwo levels of 20sqm in the city center.
\r\nImmediate availability !
\r\nSee pictures attached !","expired":0,"id":"65050","location":"Terrassiere","mark":"Mark / Save Ad","mem_first_name":"Thibaut ","mem_id":"59682","mem_link":"javascript:open_login_popup();","mem_name":"Thibaut Mirieu de Labarre ","mem_name_js":"Thibaut Mirieu de Labarre ","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":"/_media/board_flat1/65/65050_bl_photo_e877f.jpg","photo2":"/_media/board_flat1/65/65050_bl_photo2_ab7f9.jpg","photo3":"/_media/board_flat1/65/65050_bl_photo3_32d1d.jpg","photo4":"/_media/board_flat1/65/65050_bl_photo4_4f978.jpg","photos":1,"price":"1805","rooms":"2","status":null,"title":"Arcade to rent in Terrassiere !","title_js":"Arcade to rent in Terrassiere !","type":"Office / Commercial","views":"11"},{"available":"Immediate","city":"Geneva","column_headings":0,"contact":"+41 22 566 50 58","currency":"CHF","date":"Jan 25, 16","description":"Are you an Entrepreneur ?
\r\nAre you concealing personal and private life ?
\r\nDo you want to have entreprenership expertise in social or fundraising in house ?
\r\nJoin Soft - Space, th social coworking space in Eaux-Vives !!!
\r\n
\r\nhttp://www.yoursoftweb.org/softspace/
\r\naccueil@yoursoftweb.org
\r\n2 rue des Cordiers
\r\n1207 Gen\u00e8ve","expired":0,"id":"66583","location":"Eaux-Vives","mark":"Mark / Save Ad","mem_first_name":"Thibaut ","mem_id":"59682","mem_link":"javascript:open_login_popup();","mem_name":"Thibaut Mirieu de Labarre ","mem_name_js":"Thibaut Mirieu de Labarre ","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":0,"photo2":0,"photo3":0,"photo4":0,"photos":0,"price":"40","rooms":"10","status":null,"title":"Coworking Space in Eaux-Vives","title_js":"Coworking Space in Eaux-Vives","type":"Office / Commercial","views":"4"},{"available":"Immediate","city":"Geneva","column_headings":0,"contact":"","currency":"CHF","date":"Jan 25, 16","description":"Room in nicely furnished apt. Conveniently located 15mn walk from the UN, 7mn from Train Station, across the road from Tram Station, Migros, COOP and UBS Servette. CHF 1400 per month (incl internet, electricity, heating...). Available immediately for 3 to 6 months. Preferably professionals. Main tenant very often on mission out of Geneva. Current housemates are male and female. Visits possible evenings.","expired":0,"id":"56733","location":"Servette","mark":"Unmark Ad","mem_first_name":"Romanticus","mem_id":"23627","mem_link":"javascript:open_login_popup();","mem_name":"Romanticus","mem_name_js":"Romanticus","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":"/_media/board_flat1/56/56733_bl_photo_e8e69.jpg","photo2":"/_media/board_flat1/56/56733_bl_photo2_691c8.jpg","photo3":"/_media/board_flat1/56/56733_bl_photo3_59137.jpg","photo4":"/_media/board_flat1/56/56733_bl_photo4_77510.jpg","photos":1,"price":"1400","rooms":"1","status":"\"Marked\"","title":"Room in nicely furnished apartment walking distance to UN","title_js":"Room in nicely furnished apartment walking distance to UN","type":"Apt shares / Room mates","views":"9"},{"available":"Flexible","city":"Annemassee","column_headings":0,"contact":"0775036634","currency":"CHF","date":"Jan 25, 16","description":"Apartment for sale at the heart of at of Annemasse Chabais
\r\nParc area.near Annemasse Gare. Transport bus 61 direct to Geneva Cornavin
\r\nDescription:
\r\n
\r\nYear of Construction : 2009
\r\n70 Sqm
\r\nGround floor with terrace and garden
\r\n2 bedrooms
\r\nEquipped Kitchen
\r\n1 Bathroom.
\r\n1 WC
\r\nI underground closed garage,
\r\nLarge fitted cupboards in both rooms and hallway.
\r\n
\r\nAvailable for sale directly from owner.
\r\nReal Estate Agents please do not contact.","expired":0,"id":"59649","location":"Annemasse Park Chablais Area","mark":"Mark / Save Ad","mem_first_name":"Deena","mem_id":"66337","mem_link":"javascript:open_login_popup();","mem_name":"Deena D","mem_name_js":"Deena D","mem_photo":"http://cdn.glocals.com/sites/glocals/_static_media/public/members/empty54.gif","network":"Geneva","photo1":0,"photo2":0,"photo3":0,"photo4":0,"photos":0,"price":"0","rooms":"2","status":null,"title":"Annemasse 2 bedroom apartment for sale directly from owner. 260,000 Euros","title_js":"Annemasse 2 bedroom apartment for sale directly from owner. 260,000 Euros","type":"Real estate for sale","views":"2"},{"available":"Immediate","city":"Florence, Italy","column_headings":0,"contact":"0766794965.","currency":"CHF","date":"Jan 25, 16","description":"Very nice and large apartment in a perfect location, close to the magnificent Florence's Cathedral.
\r\nIt is ideal for a group of friends or a big family and it is the perfect starting point to visit Florence.
\r\n
\r\nSituated in one of the most beautiful ancient Florentine streets, this apartment has been newly renovated and tastefully furnished.
\r\n
\r\nEverything is close: few meters and you get to the Bargello Museum, the Duomo, Santa Croce Church, the Uffizi Gallery and Ponte Vecchio.
\r\n
\r\nAll kind of shops are within walking distance from the apartment, including the open air market of Sant' Ambrogio, good restaurants, bars and wine bars.
\r\n
\r\nAccommodation ( second floor with lift)
\r\nentrance, living room with sofa and dining area, 1 double bedroom, one single bedroom, one double bedroom with french bed (dim: 140x190cm), one double bedroom, two bathrooms with shower, fully equipped kitchen.
\r\n
\r\nFacilities:
\r\nWIFI, washer, dishwasher, TV, toaster, american coffee machine, iron and ironing board, electric oven, fridge, stove, air conditioning in the living and in one double bedroom ( the pink one), lift.
\r\n
\r\nFor more pictures (as cannot attach here more than 4 pictures) check out the agent website http://www.residenzalafonte.com/daklea_apartment_en.html?
\r\n
\r\nPrice for half the apartment can sleep 4 ppl (living room, bed room, kitchen bathroom) - 100 euros a night
\r\nPrice for the whole apartment can sleep 8 ppl - 200 euros","expired":0,"id":"58847","location":"Florence","mark":"Mark / Save Ad","mem_first_name":"adas","mem_id":"37980","mem_link":"javascript:open_login_popup();","mem_name":"adas","mem_name_js":"adas","mem_photo":"http://cdn.glocals.com/sites/glocals/_media/members/37/37980_mem_photo_4c607.jpg","network":"Geneva","photo1":"/_media/board_flat1/58/58847_bl_photo_8c1af.jpg","photo2":"/_media/board_flat1/58/58847_bl_photo2_7a113.jpg","photo3":"/_media/board_flat1/58/58847_bl_photo3_2cfa7.jpg","photo4":"/_media/board_flat1/58/58847_bl_photo4_90bf6.jpg","photos":1,"price":"0","rooms":"4","status":null,"title":"Luxury apartment with 4 bedrooms in the center of Florence for rent for holiday","title_js":"Luxury apartment with 4 bedrooms in the center of Florence for rent for holiday","type":"Apts / Housing for rent","views":"7"}],"totalCount":520} \ No newline at end of file -- cgit v1.2.1