首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pypandoc将嵌套列表从JSON字符串转换为MD字符串

使用pypandoc将嵌套列表从JSON字符串转换为MD字符串
EN

Stack Overflow用户
提问于 2022-09-28 11:41:34
回答 1查看 38关注 0票数 0

前言

我完全知道,将JSON (复杂数据结构)转换为MD (标记语言)可能是一个定义不明确的概念,因为它们不能表示相同的东西。无论如何,我认为它可以用于简单的结构,如嵌套列表。

关于pypandoc和这种转换的文档很少,无论如何,我阅读this post时有一个类似的问题,我想知道它是否可以实现,但我无法使它像预期的那样工作。

MCVE

假设我想将一些简单的JSON嵌套列表转换为MD嵌套列表。这是我的MCVE

代码语言:javascript
复制
import json
import pypandoc

items = [
    "Item A",
    "Item B",
    "Item C:", ["Sub Item C.1", "Sub Item C.2", "Sub Item C.3"],
    "Item D", ["Sub Item D.1", "Sub Item D.2"],
    "Item E"
]

result = pypandoc.convert_text(json.dumps(items), to="json", format="md")

它显然返回一个JSON字符串:

代码语言:javascript
复制
'{"pandoc-api-version":[1,22,2,1],"meta":{},"blocks":[{"t":"Para","c":[{"t":"Str","c":"["},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"Item"},{"t":"Space"},{"t":"Str","c":"A"}]]},{"t":"Str","c":","},{"t":"Space"},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"Item"},{"t":"Space"},{"t":"Str","c":"B"}]]},{"t":"Str","c":","},{"t":"Space"},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"Item"},{"t":"Space"},{"t":"Str","c":"C:"}]]},{"t":"Str","c":","},{"t":"Space"},{"t":"Str","c":"["},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"Sub"},{"t":"Space"},{"t":"Str","c":"Item"},{"t":"Space"},{"t":"Str","c":"C.1"}]]},{"t":"Str","c":","},{"t":"Space"},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"Sub"},{"t":"Space"},{"t":"Str","c":"Item"},{"t":"Space"},{"t":"Str","c":"C.2"}]]},{"t":"Str","c":","},{"t":"Space"},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"Sub"},{"t":"Space"},{"t":"Str","c":"Item"},{"t":"Space"},{"t":"Str","c":"C.3"}]]},{"t":"Str","c":"],"},{"t":"Space"},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"Item"},{"t":"Space"},{"t":"Str","c":"D"}]]},{"t":"Str","c":","},{"t":"Space"},{"t":"Str","c":"["},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"Sub"},{"t":"Space"},{"t":"Str","c":"Item"},{"t":"Space"},{"t":"Str","c":"D.1"}]]},{"t":"Str","c":","},{"t":"Space"},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"Sub"},{"t":"Space"},{"t":"Str","c":"Item"},{"t":"Space"},{"t":"Str","c":"D.2"}]]},{"t":"Str","c":"],"},{"t":"Space"},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"Item"},{"t":"Space"},{"t":"Str","c":"E"}]]},{"t":"Str","c":"]"}]}]}\r\n'

它似乎是需要编码的内部表示,但这不是MD。

但我期待着这个输出:

代码语言:javascript
复制
 - Item A
 - Item B
 - Item C
   - Sub Item C.1
   - Sub Item C.2
   - Sub Item C.3
 - Item D
   - Sub Item D.1
   - Sub Item D.2
 - Item E

奇怪的是,开关toformat的术语混淆,似乎表明从MD到JSON的转换。

当按相反顺序配置调用时,它不幸地失败了:

代码语言:javascript
复制
result = pypandoc.convert_text(json.dumps(items), format="json", to="md")

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_7128/3771718373.py in <module>
----> 1 result = pypandoc.convert_text(json.dumps(items), format="json", to="md")

~\anaconda3\lib\site-packages\pypandoc\__init__.py in convert_text(source, to, format, extra_args, encoding, outputfile, filters, verify_format, sandbox, cworkdir)
     91     """
     92     source = _as_unicode(source, encoding)
---> 93     return _convert_input(source, format, 'string', to, extra_args=extra_args,
     94                           outputfile=outputfile, filters=filters,
     95                           verify_format=verify_format, sandbox=sandbox,

~\anaconda3\lib\site-packages\pypandoc\__init__.py in _convert_input(source, format, input_type, to, extra_args, outputfile, filters, verify_format, sandbox, cworkdir)
    416     # check that pandoc returned successfully
    417     if p.returncode != 0:
--> 418         raise RuntimeError(
    419             'Pandoc died with exitcode "%s" during conversion: %s' % (p.returncode, stderr)
    420         )

RuntimeError: Pandoc died with exitcode "64" during conversion: JSON parse error: Error in $: mempty

所以我想知道是否有可能使用pypandoc将JSON转换成MD

对于在第一个示例中返回的JSON,我要做的是,它是否是一个内部pandoc表示,之后确实可以转换为MD?我错过了什么来实现这个转变?

EN

回答 1

Stack Overflow用户

发布于 2022-09-28 11:50:40

虽然没有直接回答问题,但似乎可以通过使用snakemd实现预期的输出。

代码语言:javascript
复制
import snakemd

items = snakemd.MDList([
    "Item A",
    "Item B",
    "Item C:", snakemd.MDList(["Sub Item C.1", "Sub Item C.2", "Sub Item C.3"]),
    "Item D", snakemd.MDList(["Sub Item D.1", "Sub Item D.2"]),
    "Item E"
])

items.render()

返回:

代码语言:javascript
复制
- Item A
- Item B
- Item C:
  - Sub Item C.1
  - Sub Item C.2
  - Sub Item C.3
- Item D
  - Sub Item D.1
  - Sub Item D.2
- Item E

但这并不能回答原来的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73880795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档