Proper encoding of JSON MARC records
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 5 Dec 2013 16:20:10 +0000 (17:20 +0100)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 5 Dec 2013 16:20:10 +0000 (17:20 +0100)
include/yaz/marcdisp.h
src/marcdisp.c

index 0b2b66b..0d029c5 100644 (file)
@@ -262,6 +262,15 @@ int yaz_marc_write_xml(yaz_marc_t mt, xmlNode **root_ptr,
                        const char *type);
 #endif
 
                        const char *type);
 #endif
 
+/** \brief writes MARC record in JSON represenation
+    \param mt handle
+    \param w WRBUF for output
+    \retval 0 Creation successful
+    \retval -1 ERROR
+*/
+YAZ_EXPORT
+int yaz_marc_write_json(yaz_marc_t mt, WRBUF w);
+
 /** \brief sets leader spec (for modifying bytes in 24 byte leader)
     \param mt handle
     \param leader_spec
 /** \brief sets leader spec (for modifying bytes in 24 byte leader)
     \param mt handle
     \param leader_spec
index 78244a0..edb0c9b 100644 (file)
@@ -1266,19 +1266,21 @@ int yaz_marc_write_json(yaz_marc_t mt, WRBUF w)
     for (n = mt->nodes; n; n = n->next)
     {
         struct yaz_marc_subfield *s;
     for (n = mt->nodes; n; n = n->next)
     {
         struct yaz_marc_subfield *s;
-        int i;
         const char *sep = "";
         switch (n->which)
         {
         const char *sep = "";
         switch (n->which)
         {
+        case YAZ_MARC_LEADER:
+        case YAZ_MARC_COMMENT:
+            break;
         case YAZ_MARC_CONTROLFIELD:
             if (first)
                 first = 0;
             else
                 wrbuf_puts(w, ",\n");
             wrbuf_puts(w, "\t\t{\n\t\t\t\"");
         case YAZ_MARC_CONTROLFIELD:
             if (first)
                 first = 0;
             else
                 wrbuf_puts(w, ",\n");
             wrbuf_puts(w, "\t\t{\n\t\t\t\"");
-            wrbuf_json_puts(w, n->u.controlfield.tag);
+            wrbuf_iconv_json_puts(w, mt->iconv_cd, n->u.controlfield.tag);
             wrbuf_puts(w, "\":\"");
             wrbuf_puts(w, "\":\"");
-            wrbuf_json_puts(w, n->u.controlfield.data);
+            wrbuf_iconv_json_puts(w, mt->iconv_cd, n->u.controlfield.data);
             wrbuf_puts(w, "\"\n\t\t}");
             break;
         case YAZ_MARC_DATAFIELD:
             wrbuf_puts(w, "\"\n\t\t}");
             break;
         case YAZ_MARC_DATAFIELD:
@@ -1297,9 +1299,11 @@ int yaz_marc_write_json(yaz_marc_t mt, WRBUF w)
                 wrbuf_puts(w, sep);
                 sep = ",\n";
                 wrbuf_puts(w, "\t\t\t\t\t{\n\t\t\t\t\t\t\"");
                 wrbuf_puts(w, sep);
                 sep = ",\n";
                 wrbuf_puts(w, "\t\t\t\t\t{\n\t\t\t\t\t\t\"");
-                wrbuf_json_write(w, s->code_data, using_code_len);
+                wrbuf_iconv_json_write(w, mt->iconv_cd,
+                                       s->code_data, using_code_len);
                 wrbuf_puts(w, "\":\"");
                 wrbuf_puts(w, "\":\"");
-                wrbuf_json_puts(w, s->code_data + using_code_len);
+                wrbuf_iconv_json_puts(w, mt->iconv_cd,
+                                      s->code_data + using_code_len);
                 wrbuf_puts(w, "\"\n\t\t\t\t\t}");
             }
             wrbuf_puts(w, "\n\t\t\t\t]");
                 wrbuf_puts(w, "\"\n\t\t\t\t\t}");
             }
             wrbuf_puts(w, "\n\t\t\t\t]");
@@ -1320,6 +1324,7 @@ int yaz_marc_write_json(yaz_marc_t mt, WRBUF w)
     }
     wrbuf_puts(w, "\n\t]\n");
     wrbuf_puts(w, "}\n");
     }
     wrbuf_puts(w, "\n\t]\n");
     wrbuf_puts(w, "}\n");
+    return 0;
 }
 
 int yaz_marc_decode_wrbuf(yaz_marc_t mt, const char *buf, int bsize, WRBUF wr)
 }
 
 int yaz_marc_decode_wrbuf(yaz_marc_t mt, const char *buf, int bsize, WRBUF wr)