反序列化一个匿名的JSON数组?

9
我得到了一个匿名数组,想要反序列化它,这里是第一个数组对象的示例。
[
  { "time":"08:55:54",
    "date":"2016-05-27",
    "timestamp":1464332154807,
    "level":3,
    "message":"registerResourcePath ('', '/sap/bc/ui5_ui5/ui2/ushell/resources/')",
    "details":"","component":"sap.ui.ModuleSystem"},
  {"time":"08:55:54","date":"2016-05-27","timestamp":1464332154808,"level":3,"message":"URL prefixes set to:","details":"","component":"sap.ui.ModuleSystem"},
  {"time":"08:55:54","date":"2016-05-27","timestamp":1464332154808,"level":3,"message":"  (default) : /sap/bc/ui5_ui5/ui2/ushell/resources/","details":"","component":"sap.ui.ModuleSystem"}
]

我尝试使用CL_TREX_JSON_SERIALIZER进行反序列化,但它已经损坏,并且不能使用我的JSON。这里是为什么

然后我尝试了/UI2/CL_JSON,但它需要一个“结构”,完全适合JSON对象给出的对象。 “结构”在我的情况下意味着具有属性time,date,timestamp,level,messagedetails的对象的内部表格。问题在于:它没有正确处理引用,并使用类说明来描述分配给字段符号的字段。由于我只能拥有一个对象引用列表而不是对象列表,因此该解决方案也无法正常工作。

第三次尝试,我按照Horst Keller的描述使用CALL TRANSFORMATION,但使用此方法时,我无法读取匿名数组。这里是为什么

我的主要观点:

  • 我不想改变JSON,因为这就是我从sap.ui.log中得到的。
  • 我更喜欢使用内置功能而不是第三方框架。

你尝试过这个了吗? - Jagger
@Jagger 是的,它基于“调用转换”,需要(通过语法“CALL TRANSFORMATION demo_st_json_table SOURCE XML json RESULT **carriers = result.**”)一个命名根节点(在这种情况下为“carriers”),而我在我的匿名数组中没有。 - inetphantom
更改JSON“即时”是否可接受?我将把这个JSON读入一个字符串中(假设它总是那么小),然后在开头粘贴“anonymous”:{,在结尾处粘贴}。然后尝试使用CALL TRANSFORMATION进行所需的任何操作,并在需要时从输出中删除这些粘合部分。 - Jagger
@Jagger,这会变得非常长。这是一个UI5应用程序的客户端日志(2000个对象?)。我宁愿不使用这样的黑客方法。这可能是一种解决方案。解析器是另一种方法。 - inetphantom
2个回答

2
你的问题不是来自于数组的匿名性,而是来自于SAP JSON (De)serializer的笨拙,它不尊重用于包含JSON属性的双引号。这个问题已经在这个答案中得到了详细的描述。
如果你不想实时更改你的JSON,你唯一的办法就是修改CL_TREX_JSON_DESERIALIZER类,像这样

2

/UI5/CL_JSON_PARSER 可以解析未知格式的 JSON。

请注意,它上面写着“仅供内部使用”很多次,所以您可能应该认真对待它,并克隆其代码以固定它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接