在 JSON 转换为 CSV 期间保持 JSON 键的顺序

2024-05-05

我正在使用此处提供的 JSON 库http://www.json.org/java/index.html http://www.json.org/java/index.html为了将 json 字符串转换为 CSV。 但我遇到的问题是,转换后键的顺序丢失了。

这是转换代码:

    JSONObject jo = new JSONObject(someString);
    JSONArray ja = jo.getJSONArray("items");
    String s = CDL.toString(ja);
    System.out.println(s);

这是“someString”的内容:

{
    "items":
    [
        {
            "WR":"qwe",
            "QU":"asd",
            "QA":"end",
            "WO":"hasd",
            "NO":"qwer"
        },
    ]
}

这是结果:

WO,QU,WR,QA,NO
hasd,asd,qwe,end,qwer

虽然我期望的是保持键的顺序:

WR,QU,QA,WO,NO
qwe,asd,end,hasd,qwer

有什么办法可以使用这个库得到这个结果吗?如果没有,是否有其他库可以提供保持结果中键的顺序的功能?


有一些(hacky)方法可以做到这一点......但你不应该这样做。

在 JSON 中,对象的定义如下:

对象是一组无序的名称/值对。

See http://json.org http://json.org.

大多数 JSON 实现都没有努力保留对象的名称/值对的顺序,因为它(根据定义)并不重要。

如果你想保留顺序,你需要重新定义你的数据结构;例如

{
    "items":
    [
        [
            {"WR":"qwe"},
            {"QU":"asd"},
            {"QA":"end"},
            {"WO":"hasd"},
            {"NO":"qwer"}
        ],
    ]
}

或者更简单地说:

{
    "items":
    [
        {"WR":"qwe"},
        {"QU":"asd"},
        {"QA":"end"},
        {"WO":"hasd"},
        {"NO":"qwer"}
    ]
}

FOLLOWUP

感谢您提供的信息,但我别无选择,只能在我的应用程序中使用 JSON,并且无论 JSON 对象的定义如何,我的应用程序都需要保持键的顺序...我不允许更改 JSON 文件的格式还有...

您需要与设计该文件结构的人进行艰苦的对话,并且不会让您更改它。这是/他们完全错误的。你need说服他们。

If they really不会让你改变它:

  • 你应该坚持not称其为 JSON...因为它不是。
  • 您应该指出,您将必须专门编写/修改代码来处理这种“非 JSON”格式......除非您能找到一些保留顺序的 JSON 实现。如果他们是付费客户,请确保他们为您必须做的额外工作付费。
  • 您应该指出,如果“非 JSON”需要由其他工具使用,则会出现问题。确实,这个问题会反复出现……

这种事情实在是太糟糕了。一方面,您的软件将违反旨在促进互操作性的完善/长期存在的规范。另一方面,设计这种蹩脚(不是 JSON!)文件格式的傻瓜可能会嘲笑其他人的系统等,因为系统无法应对their废话。

UPDATE

还值得一读的是JSON RFC (RFC 7159) https://www.rfc-editor.org/rfc/rfc7159就这个话题说。以下是一些摘录:

自 RFC 4627 发布以来的这些年里,JSON 发现了非常 用途广泛。这种经历揭示了某些模式, 虽然其规范允许,但已引起互操作性 问题。

JavaScript 对象表示法 (JSON) 是一种文本格式 结构化数据的序列化。 ...

JSON 可以表示四种基本类型(字符串、数字、布尔值、 和 null)和两种结构化类型(对象和数组)。

一个对象是一个无序的零个或多个名称/值的集合 对,其中名称是字符串,值是字符串、数字, 布尔值、null、对象或数组。

据观察,JSON 解析库在是否或 不是它们使对象成员的顺序对调用可见 软件。其行为不依赖于成员的实现 排序将是可互操作的,因为它们不会 受这些差异的影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JSON 转换为 CSV 期间保持 JSON 键的顺序 的相关文章

随机推荐

  • 用python计算网页大小

    我将如何使用 Python 计算网页 url 的大小 我尝试了 urllib2 并获取内容长度标头 但它不存在 import urllib2 url http www google com r urllib2 urlopen url Not
  • 从 proc/pid/cmdline 解析命令行参数

    我正在尝试解析命令行参数另一个程序 这是一个模拟器 在我的程序中使用system 命令和模拟器的pid 不幸的是同时使用文件读取和cat 输出格式不正确 所以我无法真正获取数据 cat在命令行上显示删除了空格的文件内容 整个字符串粘在一起
  • Raphael JS 中的动画字体大小是否有流畅的过渡可能性?

    到目前为止似乎它不流畅 但波涛汹涌 例如 如果您有一个 font size 14 的状态属性 并且想要以动画方式显示 font size 16 的状态 则过渡看起来并不平滑 它分两步跳跃 首先更改为 15 然后更改为 16px 可以强迫它看
  • 将文件扩展名与应用程序关联

    我编写了一个编辑特定文件类型的程序 我想为用户提供在启动时将我的应用程序设置为该文件类型的默认编辑器的选项 因为我不需要安装程序 我尝试编写一个可重用的方法 通过向 HKEY CLASSES ROOT 添加一个键来为我关联一个文件 最好在任
  • 在 Ruby 中覆盖 BigDecimal to_s 默认值

    当我从数据库表中检索数据时 会填充一个数组 某些字段被定义为小数和货币字段 并且在数组中它们表示为 BigDecimal 我使用这些数组值来填充 CSV 文件 但问题是所有 BigDecimal 值默认都以科学格式表示 这是 BigDeci
  • 客户端上传并读取文件,角度为2

    我需要用户的日志文件 以便我可以读取和分析这些文件 例如某种放置区域 用户放置一个文件 然后我可以用javascript读取它 我使用 Angular2 rc5 我有 node js 在后台运行 但我不需要那里的数据 我只需要在客户端 是否
  • 装饰器功能不起作用(意外标记)

    刚刚尝试在 React 中使用装饰器 import React from react import Fade from Transitions Fade import withVisible from withVisible withVis
  • 从文本文件中读取所有内容 - C

    我正在尝试从文本文件中读取所有内容 这是我写的代码 include
  • GitHub v3 API - 如何在存储库中创建初始提交?

    我正在使用 v3 API 并设法列出存储库 树 分支 访问文件内容并创建 blob 树 提交 我现在正在尝试创建一个新的存储库 并设法使用 POST user repos 来完成它 但是当我尝试在这个新存储库中创建 blob trees c
  • 从壁纸中获取颜色? - 安卓

    如何找到当前壁纸的 平均 颜色并将该颜色设置为我的小部件上的布局 我正在尝试做的一个例子 这是 AccuWeather 上的设置 您可以使用WallpaperManager getWallpaperColors https develope
  • 上传中止导致 Sails js/Skipper 崩溃

    Ref https github com balderdashy skipper issues 49 https github com balderdashy skipper issues 49 适配器 船长 gridfs 基本控制器代码
  • float.Parse 不再在 Unity 中工作 (C#)

    我有一个包含以下代码行的工作项目 public InputField mass float val float Parse mass text 非常简单 用户输入一定量的质量 然后将其从文本解析为浮动 几天前这工作得很好 我什至能够多次导出
  • Android 是否可以获取用户和设备所在国家/地区的货币代码?

    是否可以获取用户和设备所在国家 地区的货币代码 我想将用户当前国家 地区的国家 地区代码设置为默认国家 地区 我们在 Android 中有解决方案吗 由于这段代码可能对您有帮助 public class CurrencyTest publi
  • ASP.NET 电子邮件发送缓慢

    在我的 Web 应用程序 ASP NET MVC 中 我使用以下命令发送电子邮件 MailMessage msg new MailMessage email protected cdn cgi l email protection some
  • 将 Pandas 列转换为日期时间

    我在 pandas DataFrame 中有一个字段以字符串格式导入 它应该是一个日期时间变量 如何将其转换为日期时间列 然后根据日期进行过滤 Example raw data pd DataFrame Mycol 05SEP2014 00
  • 如何配置jackson属性命名策略?

    此代码不起作用 Configuration public class RepositoryRestMvcConfig extends RepositoryRestMvcConfiguration Bean Override public O
  • 如何在node-mysql查询后获取警告

    如何获取查询执行后识别的相应警告 如下所示 connection query squery function err rows search for OkPacket in 2 dimension array var warningCoun
  • 可空引用类型意外 CS8629 可空值类型对于临时变量可能为空

    在 C 8 项目中 我使用可为 null 的引用类型 并收到意外的 或者至少对我来说意外的 CS8629 警告 bool singleContent x DataInt null bool multiContent x DataNvarch
  • [a-zA-Z] 的正则表达式

    我有一个仅匹配英文字母的正则表达式 a a zA Z 字符类 有没有内置的正则表达式 我的意思是像 s or w 您正在要求一个速记班 http www regular expressions info shorthand html对于英文
  • 在 JSON 转换为 CSV 期间保持 JSON 键的顺序

    我正在使用此处提供的 JSON 库http www json org java index html http www json org java index html为了将 json 字符串转换为 CSV 但我遇到的问题是 转换后键的顺序