CreateObject(“htmlfile“)如何使用JSON.stringif

本文讲述了如何在VBA中通过HTMLFile对象和ScriptControl对象来解析JSON字符串,提供示例代码以提取和访问JSON数据

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vba解析JSON字符串

vba解析JSON字符串

vba解析JSON大概有4种方法

1、htmlfile对象解析json(支持32位和64位系统)

思路:创建htmlfile对象,使用write方法写入浏览器版本,创建parentwindow对象,在使用execscript对象执行js代码,使用eval对象根据属性名获取属性值

'封装提取JSON的函数,可复制函数到vba中,直接调用函数名
Function getJsonAttribute(jsonstr, expre As String) 'expre填写规则:【jstr.属性名...】,jstr是根对象,可以不需要填写,直接【属性...】
    Dim oHtml As Object
    '定义HtmlDocument对象
    Set oHtml = CreateObject("htmlfile")
    '设置IE浏览器版本
    oHtml.write "<meta http-equiv='X-UA-Compatible'content='IE=8'\>"
    Dim oWindow, s01, s02, s03 As Object
    Set oWindow = oHtml.parentWindow
    With oWindow
        .execScript "var jstr=" & jsonstr'将json字符串加入js代码中,声明变量jstr
    End With
    'Set s01 = oWindow.eval("JSON.stringify(jstr,null,2)")
    'Dim s04 As String
    's04 = oWindow.eval("JSON.stringify(jstr,null,2)")
    'Debug.Print s04
    'Set s03 = oWindow.arr03
    getJsonAttribute = oWindow.eval("jstr." & expre)'属性值表达式,获取值赋给函数返回
    Set oHtml = Nothing
    Set oWindow = Nothing
End Function
2、ScriptControl对象解析json

这里代码引用网友的帖子

Sub TestJson()
 Dim jsstr As String
 'vb搞个字符串要加n个引号,真是烦人
 jsstr = "{""系别"":""历史系"",""班级"":""一班""," & _
          """学员"":[{""姓名"":""张三"",""年龄"":25,""性别"":""男""}," & _
                     "{""姓名"":""李四"",""年龄"":20,""性别"":""男""}," & _
                     "{""姓名"":""小明"",""年龄"":20,""性别"":""女""}" & _
                    "]" & _
          "}"      
 Dim age As Integer
 Set scobj = CreateObject("ScriptControl")        
'调用MSScriptControl.ScriptControl对象将提取的变量文本运算形成对象集合    
'ScriptControl使用的脚本语言。除了js,也支持Vbscript
scobj.Language = "JavaScript"
'往脚本里添加代码,参数是字符串
scobj.AddCode ("var query = " & jsstr)
'JSON对象获取属性的表示方法:对象.属性
'属性的值如果是个包含多个对象的数组,可以使用索引表示取得对象:对象.属性[0]
'Eval是表达式求值
age = scobj.Eval("query.学员[2].年龄")
Debug.Print "历史系一班的第3个学员的年龄是" & age & "岁"      
End Sub
Feedback Type: Frown (Error) Timestamp: 2025-03-19T04:18:22.3709762Z Local Time: 2025-03-19T12:18:22.3709762+08:00 Session ID: f4c8b48c-3a8c-4239-ac2c-6f0d087bd6cd Release: February 2025 Product Version: 2.140.1577.0 (25.02)+00af0910c5ca19a229c472b0dfc17a2c488f6b0a (x64) Error Message: Power BI 无法加载此视觉对象的数据,因为其格式不正确。请联系仪表板所有者。 Stack Trace: Host:Newtonsoft.Json.JsonReaderException 在 Newtonsoft.Json.JsonReader.Push(JsonContainerType value) 在 Newtonsoft.Json.JsonTextReader.ParseValue() 在 Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) 在 Newtonsoft.Json.Serialization.JsonSerializerIntern
最新发布
03-20
<think>好的,我现在需要帮助用户解决Power BI加载视觉对象时出现的“格式不正确”错误,具体是Newtonsoft.Json.JsonReaderException的问题。首先,我需要了解这个错误的常见原因和解决方案。根据用户提供的引用,特别是引用[2]中提到实时数据虚拟化和流数据集,可能涉及到数据格式的问题。 首先,这个错误通常与JSON数据解析有关。可能是在加载数据时,某些字段的数据格式不符合JSON标准,比如日期格式不正确、字符串缺少引号,或者存在嵌套结构错误。另外,数据源可能包含特殊字符或者编码问题,导致解析失败。需要检查数据源的结构是否正确,尤其是在使用流数据集或API推送数据时(如引用[2]和引用[5]提到的Service Bus Queue Trigger),数据格式必须严格符合要求。 接下来,我应该考虑数据预处理步骤。比如,用户是否使用了Power Automate或Azure SQL(引用[3]和[4])来处理数据?如果数据在进入Power BI之前没有正确清洗,可能会导致JSON解析错误。例如,从Azure SQL获取的数据如果有不一致的格式,或者字段类型不匹配,也可能引发问题。 然后,检查Power BI中的数据集设置。用户可能使用了流式数据集,而实时数据可能存在格式变化,比如新增字段或结构变动,导致视觉对象加载失败。需要确认数据集的架构是否稳定,所有字段的数据类型是否一致。 另外,考虑Newtonsoft.Json库的版本问题。如果Power BI使用的是较旧的版本,可能无法解析某些新的JSON特性。不过,用户通常无法直接升级库,所以需要调整数据格式以适应现有版本。 可能的解决方案包括验证数据源的JSON格式,使用在线验证工具检查是否有语法错误;确保所有字符串都有双引号,避免单引号;检查日期和数字格式是否符合标准;处理嵌套结构,避免过于复杂;使用Power Query进行数据清洗,修复格式问题;以及分步加载数据以定位具体错误位置。 最后,根据引用[2]和[5],可能需要检查实时数据流的配置是否正确,确保推送的数据严格遵守Power BI的API要求。如果使用Microsoft Flow(引用[3]),需要确认流程中的数据转换步骤是否正确处理了JSON结构。</think>### Power BI数据加载失败“格式不正确”问题的逐步解决方案 当Power BI加载视觉对象时出现**Newtonsoft.Json.JsonReaderException**错误,通常与数据源的JSON格式不规范有关。以下是具体排查步骤和解决方案: --- #### **1. 验证数据源的JSON格式** - **问题根源**:JSON数据中存在语法错误(如缺少引号、括号不匹配、非法字符等)会导致解析失败[^2]。 - **解决方法**: 1. 使用在线JSON验证工具(如[JSONLint](https://jsonlint.com/))检查原始数据。 2. 确保所有**字符串值**用双引号包裹(例如:`{"name": "value"}`而非单引号`{'name': 'value'}`)。 3. 检查特殊字符(如换行符`\n`、反斜杠`\`)是否已转义。 4. 确认日期时间格式符合ISO标准(例如:`"2023-10-01T12:00:00Z"`)。 --- #### **2. 处理嵌套结构或数组** - **问题根源**:Power BI对嵌套JSON的支持有限,复杂结构可能导致解析失败[^5]。 - **解决方法**: 1. 在Power Query编辑器中展开嵌套字段时,选择**展开为新的行**或**提取值为列表**。 2. 若数据包含多层嵌套,建议先在数据源侧(如Azure SQL或API)将数据扁平化[^4]。 3. 示例代码(Power Query展开数组): ```powerquery = Table.ExpandListColumn(Source, "nestedArray") ``` --- #### **3. 检查数据编码与分隔符** - **问题根源**:非UTF-8编码或包含非法分隔符(如未转义的逗号)会导致解析中断。 - **解决方法**: 1. 在数据源导出时指定编码为**UTF-8 with BOM**。 2. 替换字段中的保留字符(如逗号`,`替换为全角符号`,`)。 --- #### **4. 分步加载数据定位错误位置** - **问题根源**:错误可能由某一行或某一列数据引发。 - **解决方法**: 1. 在Power Query编辑器中逐步加载数据: - 先加载前100行,确认无错误后扩大范围。 - 使用`try...otherwise`函数捕获异常值: ```powerquery = Table.AddColumn(Source, "IsValid", each try [ColumnName] otherwise "Error") ``` 2. 筛选出包含`Error`的行,针对性修复数据。 --- #### **5. 更新数据连接方式** - **问题根源**:实时流数据(如Service Bus队列)可能因数据推送格式错误导致问题。 - **解决方法**: 1. 检查推送数据的代码(如Azure Function)是否符合Power BI流式数据集的API要求。 2. 确保数据包包含必填字段(如`timestamp`)且类型正确。 --- #### **6. 重置数据集并清理缓存** - **问题根源**:缓存中的旧数据结构与新数据冲突。 - **解决方法**: 1. 在Power BI服务中删除并重新创建数据集。 2. 清除本地缓存:`文件 > 选项与设置 > 数据源设置 > 清除所有缓存`。 --- ### 相关问题 1. Power BI中如何正确配置实时流数据集? 2. 使用Power Query清洗JSON数据有哪些最佳实践? 3. 如何通过Azure Functions向Power BI推送实时数据? --- 通过上述步骤,可系统性地排查并解决JSON格式错误问题。如果问题仍存在,建议提供具体错误日志片段以进一步分析[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值