Index: /trunk/src/org/openstreetmap/josm/io/GeoJSONWriter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/GeoJSONWriter.java	(revision 16935)
+++ /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);
     }
 
Index: /trunk/test/unit/org/openstreetmap/josm/io/GeoJSONWriterTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/io/GeoJSONWriterTest.java	(revision 16935)
+++ /trunk/test/unit/org/openstreetmap/josm/io/GeoJSONWriterTest.java	(revision 16936)
@@ -40,4 +40,5 @@
         node.put("name", "foo");
         node.put("source", "code");
+        node.put("data", "{\"foo\": 1, \"bar\": \"baz\"}");
         final DataSet ds = new DataSet();
         ds.addPrimitive(node);
@@ -52,5 +53,9 @@
                 "            'properties': {\n" +
                 "                'name': 'foo',\n" +
-                "                'source': 'code'\n" +
+                "                'source': 'code',\n" +
+                "                'data': {\n" +
+                "                    'foo': 1,\n" +
+                "                    'bar': 'baz'\n" +
+                "                }\n" +
                 "            },\n" +
                 "            'geometry': {\n" +
