当前位置: 首页 > 面试题库 >

Json编码或序列化XML

董弘新
2023-03-14
问题内容

我有一些xml,这是它的简单版本。

<xml>
<items>
  <item abc="123">item one</item>
  <item abc="456">item two</item>
</items>
</xml>

在内容上使用SimpleXML,

 $obj = simplexml_load_string( $xml );

我可以使用$obj->xpath( '//items/item' );并访问@attributes。

我需要一个数组结果,所以我尝试了这个json_decode(json_encode($obj),true)技巧,但这看起来是要删除对@attributes的访问(即abc
=“ 123”)。

还有另一种方法可以提供对属性的访问并使我留下一个数组吗?


问题答案:

您可以使用json_encode和一起走,json_decode并可以添加缺少的内容,因为json_encode-ing使用遵循某些特定规则SimpleXMLElement

如果您对规则及其详细信息感兴趣,我已经写了两篇关于它的博客文章:

  • PHP中的SimpleXML和JSON编码–第一部分
  • PHP中的SimpleXML和JSON编码–第二部分

对于您来说,也许更有趣的是第三部分,它显示了如何修改json序列化并提供您自己的格式(例如,保留属性):

  • PHP中的SimpleXML和JSON编码–第三部分和结尾

它附带了完整的示例,下面是代码摘录:

$xml = '<xml>
<items>
  <item abc="123">item one</item>
  <item abc="456">item two</item>
</items>
</xml>';

$obj = simplexml_load_string($xml, 'JsonXMLElement');

echo $json = json_encode($obj, JSON_PRETTY_PRINT), "\n";

print_r(json_decode($json, TRUE));

JSON和数组的输出如下,请注意,属性是其中的一部分:

{
    "items": {
        "item": [
            {
                "@attributes": {
                    "abc": "123"
                },
                "@text": "item one"
            },
            {
                "@attributes": {
                    "abc": "456"
                },
                "@text": "item two"
            }
        ]
    }
}
Array
(
    [items] => Array
        (
            [item] => Array
                (
                    [0] => Array
                        (
                            [@attributes] => Array
                                (
                                    [abc] => 123
                                )

                            [@text] => item one
                        )

                    [1] => Array
                        (
                            [@attributes] => Array
                                (
                                    [abc] => 456
                                )

                            [@text] => item two
                        )

                )

        )

)


 类似资料:
  • 问题内容: 我正在编写脚本以自动生成演示数据,并且需要在JSON中序列化一些数据。该数据的一部分是图像,因此我在base64中对其进行了编码,但是当我尝试运行脚本时,我得到了: 据我所知,无论使用base64编码的任何内容(在这种情况下,都是PNG图像)都只是一个字符串,因此它应该对序列化造成问题。我想念什么? 问题答案: 您必须注意数据类型。 如果读取二进制图像,则会得到字节。如果将这些字节编码

  • 有没有一种方法可以正确地反序列化以双引号开头和结尾的JSON字符串? 数据以流的形式输入(来自AWS S3对象)。这是流的内容(注意开头和结尾的双引号字符): JsonSerializer似乎没有正确地反序列化它。但是,对于以下内容,其工作原理与预期一致: 以下是片段:

  • 问题内容: 所以我需要用PHP编码数组并将其以纯文本格式存储在MySQL数据库中,我的问题是我应该使用serialize()还是json_encode()?它们各自的优缺点是什么? 我认为他们中的任何一个都会在这种情况下这样做。但是,您想要哪一个,为什么呢?如果用于数组以外的东西? 问题答案: 的主要优点:它特定于PHP,这意味着 它可以表示PHP类型 ,包括您自己的类的实例- 并且在反序列化数据

  • 问题内容: 我正在使用JSON中的Google Geocode响应。 JSON格式如下: 我正在尝试使用Java创建序列化和反序列化它们。我尝试了GSON,但是因为它无法在更深层次上反序列化对象,所以GSON将不是一个选择。 我只是想知道是否有人对此主题有经验?也许您尝试过可以解决此问题的库?一些示例代码会很棒。 我真的不想为此编写自己的API … 问题答案: 使用杰克逊

  • 问题内容: 我在Web API项目中使用了Dictionary,该项目的序列化方式类似于JSON: 因为我有重复的键,所以我不能再使用Dictionary类型,而现在我正在使用 但这是以这种方式序列化的: 有没有办法像字典一样进行序列化? 谢谢。 问题答案: 如果您使用Newtonsoft Json.NET库,则可以执行以下操作。 定义一个转换器,以所需的方式写入键/值对的列表: 然后使用转换器:

  • 问题内容: JSON序列化自定义非序列化对象的常规方法是子类化,然后将自定义编码器传递给转储。 通常看起来像这样: 我想做的是使默认编码器可序列化的东西。我环顾四周,但找不到任何东西。我的想法是,编码器将在某些字段中确定json编码。类似的东西。也许是一个领域。python中是否有类似的东西? 我想使我正在制作的模块的一类可以对使用该包的每个人进行JSON序列化,而无需他们担心实现自己的[琐碎]自