From b8fbcf6d00bc77c4ccdb02d68c9316f3263be15a Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Thu, 5 Dec 2013 17:20:10 +0100 Subject: [PATCH] Proper encoding of JSON MARC records --- include/yaz/marcdisp.h | 9 +++++++++ src/marcdisp.c | 15 ++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/include/yaz/marcdisp.h b/include/yaz/marcdisp.h index 0b2b66b..0d029c5 100644 --- a/include/yaz/marcdisp.h +++ b/include/yaz/marcdisp.h @@ -262,6 +262,15 @@ int yaz_marc_write_xml(yaz_marc_t mt, xmlNode **root_ptr, 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 diff --git a/src/marcdisp.c b/src/marcdisp.c index 78244a0..edb0c9b 100644 --- a/src/marcdisp.c +++ b/src/marcdisp.c @@ -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; - int i; 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\""); - wrbuf_json_puts(w, n->u.controlfield.tag); + wrbuf_iconv_json_puts(w, mt->iconv_cd, n->u.controlfield.tag); 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: @@ -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_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_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]"); @@ -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"); + return 0; } int yaz_marc_decode_wrbuf(yaz_marc_t mt, const char *buf, int bsize, WRBUF wr) -- 1.7.10.4