使用 lift 将 xml 转换为 Json 行为很奇怪

2023-12-25

我正在使用 scala / lift 作为 Rest API。在后台,我生成 xml,它将通过 Xml.toJson() 转换为 json 作为输出。

现在我注意到一些奇怪的行为让我发疯。

例如我有以下 xml:

<data>
<item>
    <foo>1</foo>
    <bar>1</bar>
</item>
<item>
    <foo>2</foo>
    <bar>2</bar>
</item>
</data>

xml.toJson() 的结果如下所示:

JObject(
List(
    JField(
        data,JObject(
            List(
                JField(item,
                JArray(
                    List(
                        JObject(
                            List(
                            JField(foo,JString(1)), 
                            JField(bar,JString(1)))
                        ), 
                        JObject(
                            List(
                            JField(foo,JString(2)), 
                            JField(bar,JString(2))
                            )
                        )
                    )
                )
                )
            )
        )
    )
)
)

但如果我添加一个新的 xml 元素:

<data>
<baz>234</baz>
<item>
    <foo>1</foo>
    <bar>1</bar>
</item>
<item>
    <foo>2</foo>
    <bar>2</bar>
</item>
</data>

对于 JArray,结果有所不同:

JObject(
List(
    JField(data,JObject(
        List(
            JField(baz,JString(234)), 
            JField(item,JObject(
                List(
                    JField(foo,JString(1)), 
                    JField(bar,JString(1))
                ))
            ), 
            JField(item,JObject(
                List(
                    JField(foo,JString(2)), 
                    JField(bar,JString(2))
                ))
            )
        )
    ))
)

)

该数组未定义,我有两个名为“item”的对象。这是正常行为吗?我希望数组不包含“item”标签周围的某些内容。


是的,这是预期的行为:net.liftweb.json.Xml只会将子元素分组为JArray如果他们都有相同的名字。您可以尝试通过操作生成的 JSON 来解决此问题:

JObject(
  (json \ "data").asInstanceOf[JObject].obj.groupBy(_.name).map {
    case (_, v :: Nil) => v
    case (k, vs)       => JField(k, JArray(vs.map(_.value)))
  }.toList
)

但这里至少存在一些潜在的问题:

  1. 我们正在使用groupBy,所以我们最终可能会重新排列顺序 子元素。
  2. 如果只有一个item,它不会被包裹在JArray.

根据您的关心程度,您可以编写解决这些问题的方法,但这几乎肯定不值得。直接无视(好了net.liftweb.json.Xml并从 Scala 数据结构生成 XML 和 JSON。

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

使用 lift 将 xml 转换为 Json 行为很奇怪 的相关文章

随机推荐

  • Xcode 无法解析依赖项 Firebase - GoogleAppMeasurement 与要求不匹配

    我是 Xcode 编码新手 我尝试在我的项目上安装 Firebase 但遇到一个错误 我不知道如何解决 我已遵循 Firebase 的所有说明 但仍然存在问题 首要问题 无法解析依赖关系 因为 GoogleAppMeasurement 没有
  • PluginApplicationException:无法应用插件类“FlutterPlugin”

    我遇到了奇怪的错误 升级 Android Studio 后 我创建了一个Android项目 运行成功 然后我尝试导入Flutter Module到这个Android项目 我有这些例外 块引用 原因 org gradle api intern
  • Qt 中的 ODBC 驱动程序使用

    我想使用读取和写入mdb文件 Ms Access 文件 我是全新使用的ODBC in Qt 那么有人可以帮助我知道我是否需要下载驱动程序 如果是的话我可以从哪里下载 如果您了解连接性 那么我们将提供任何帮助 如果您需要使用 Qt 访问 MS
  • scanf 并将 char 保留为整数

    我就是无法理解 Char 是整数 对吗 所以我可以做 int var scanf d var I 65 printf c var o A 为什么这样做是错误的 char var scanf d var I A printf d var O
  • eslint-config-airbnb 扩展名“.js”的文件中不允许使用 JSX

    我已经安装了eslint config airbnb https github com airbnb javascript tree master packages eslint config airbnb应该为 React 预先配置 ES
  • 如何在 Codesys v3 中创建指向函数的指针

    你能给我一个例子来说明如何在我的库中声明函数指针吗 如何将函数指针传递给外部库 TL DR 在 CoDeSys v3 中可以使用 Totes 而且非常简单 在 CoDeSys 中 函数 实际上是存储在函数表中的函数指针 在 CodeSys
  • NSMutableArray 无法添加到

    我以前也遇到过这样的问题 但没有得到满意的答案 我有一个视图控制器 它有一个名为 counties 的属性 它是一个 NSMutableArray 我将深入导航屏幕 找到有关选择县进行地理搜索的视图 因此 搜索页面会深入到 选择县 页面 I
  • 获取应用程序开发人员名称[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想获取应用程序开发人员的名称 请有人告诉我如何得到这个 我尝试过 但只能获取已安装的应用程序及其图标 我想显示开发者名称 要获取已安
  • 如何在 DB2 上的多个表上使用 WHERE 条件执行安全的“SELECT FOR UPDATE”?

    Problem 在 DB2 版本 9 5 上的 SQL 语句 SELECT o Id FROM Table1 o Table2 x WHERE FOR UPDATE WITH RR 给我错误消息SQLSTATE 42829 不允许使用 FO
  • 更新实体框架中的嵌套对象

    最近我发现 EF 不更新嵌套对象 几天来我试图弄清楚如何做到这一点 但不幸的是我遇到了这个问题 我有对象 public class ProjectEntity AuditableEntity
  • 如何获取 mapboxgl.GeoJSONSource 对象的边界框?

    我正在设置一个 Mapbox GL JS 地图 如下所示 mapboxgl accessToken pk my token var cityBoundaries new mapboxgl GeoJSONSource data http do
  • IP 地址转换为十进制,反之亦然

    假设我的十进制数是9766322441所以它对应的是70 30 65 9但是当这个IP地址IC转换回来时 它给出了一些不同的十进制数1176387849 当我转换 google com 的 IP 地址时 即64 233 187 99然后它给
  • 表格垂直标题?

    如何使表格标题作为列显示在表格左侧 而不是作为行显示在顶部 我有这个标记 table thead tr th a th th b th tr thead tbody tr td 1 td td 2 td tr tbody table 只需使
  • 插入查询:列名称或提供的值的数量与表定义不匹配

    这是一个自动递增 ID 接受时间输入并将总计列的默认值设置为零和日期列的默认值的表getdate CREATE TABLE OrderPlaced OrderID bigint IDENTITY 1 1 PRIMARY KEY Placed
  • 实施密码恢复最佳实践

    我想在我的网络应用程序中实现密码恢复 我想避免使用秘密问题 我可以通过电子邮件发送密码 但我认为这会有风险 也许我可以生成一个新的临时随机密码并通过电子邮件发送 但我认为这与上述观点一样有风险 例如 我可以通过电子邮件发送网址吗http e
  • iPhone Settings.bundle 的本地化

    由于某种原因 我无法让 Settings bundle 识别我的其他语言 我一定错过了一些明显的东西 但我就是无法弄清楚 这是我所得到的 XCode 中的项目结构 根 plist 文件 Root plist 文件 http img227 i
  • pandas:删除缺少数据的行

    我使用以下代码删除 pandas 中缺少数据的一些行 df df replace r s np nan regex True df df replace r t np nan regex True df df dropna 但是 数据框中仍
  • 在Python中解析mailto url

    我正在尝试将 mailto URL 解析为一个不错的对象或字典 其中包括subject body等等 我似乎找不到实现此目的的库或类 你知道吗 mailto email protected cdn cgi l email protectio
  • jQuery 获取原始文本(未转义),以便通过下划线模板进一步解析

    我目前有一个 html 模式块 如下所示 div div class header buttons div p Are you sure you would like to perform on objects p div class fo
  • 使用 lift 将 xml 转换为 Json 行为很奇怪

    我正在使用 scala lift 作为 Rest API 在后台 我生成 xml 它将通过 Xml toJson 转换为 json 作为输出 现在我注意到一些奇怪的行为让我发疯 例如我有以下 xml