Index: trunk/src/org/openstreetmap/josm/io/GeoJSONWriter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/GeoJSONWriter.java	(revision 16934)
+++ trunk/src/org/openstreetmap/josm/io/GeoJSONWriter.java	(revision 16936)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.io;
 
+import java.io.StringReader;
 import java.io.StringWriter;
 import java.math.BigDecimal;
@@ -22,4 +23,6 @@
 import javax.json.JsonWriter;
 import javax.json.stream.JsonGenerator;
+import javax.json.stream.JsonParser;
+import javax.json.stream.JsonParsingException;
 
 import org.openstreetmap.josm.data.Bounds;
@@ -55,4 +58,17 @@
 
     /**
+     * This is used to determine that a tag should be interpreted as a json
+     * object or array. The tag should have both {@link #JSON_VALUE_START_MARKER}
+     * and {@link #JSON_VALUE_END_MARKER}.
+     */
+    static final String JSON_VALUE_START_MARKER = "{";
+    /**
+     * This is used to determine that a tag should be interpreted as a json
+     * object or array. The tag should have both {@link #JSON_VALUE_START_MARKER}
+     * and {@link #JSON_VALUE_END_MARKER}.
+     */
+    static final String JSON_VALUE_END_MARKER = "}";
+
+    /**
      * Constructs a new {@code GeoJSONWriter}.
      * @param ds The OSM data set to save
@@ -183,5 +199,5 @@
         final JsonObjectBuilder propObj = Json.createObjectBuilder();
         for (Entry<String, String> t : p.getKeys().entrySet()) {
-            propObj.add(t.getKey(), t.getValue());
+            propObj.add(t.getKey(), convertValueToJson(t.getValue()));
         }
         final JsonObject prop = propObj.build();
@@ -199,4 +215,17 @@
                     .add("geometry", geom.isEmpty() ? JsonValue.NULL : geom));
         }
+    }
+
+    private static JsonValue convertValueToJson(String value) {
+        if (value.startsWith(JSON_VALUE_START_MARKER) && value.endsWith(JSON_VALUE_END_MARKER)) {
+            try (JsonParser parser = Json.createParser(new StringReader(value))) {
+                if (parser.hasNext() && parser.next() != null) {
+                    return parser.getValue();
+                }
+            } catch (JsonParsingException e) {
+                Logging.warn(e);
+            }
+        }
+        return Json.createValue(value);
     }
 
