当我读取json文件并将其转换为类似PowerShell的文件时,是否有一种方法可以使Visual Studio Code中的IntelliSense自动完成正常工作
from()
问题在于文件必须先在内存中才能从json文件中获取结构并提出属性。
如果我拿出代码并在powershell终端中执行它,然后返回到代码编辑器,则自动补全工作正常。
答案 0 :(得分:2)
当前IntelliSense不能执行此操作。
某些原因是因为在编码时,通常指定的文件可能不存在,测试版本不同于预期的版本,文件可能很大,格式不正确等。默认情况下,有时安全不这样做。
通过在终端中运行它并将其加载到内存中,您将明确告诉IntelliSense您正在使用什么,然后它现在“了解”该对象,然后可以正确建议正确的属性和属性。
正如@ mklement0所建议的那样,使用键盘快捷键F8
将在集成终端中方便地执行当前行/选择,这会将对象加载到内存中,并允许您在编辑器中使用IntelliSense。
答案 1 :(得分:1)
首先,一些背景信息;在底部找到可行的解决方案。
Visual Studio Code中变量的智能感知,如果它们的类型为:
[datetime] $var = ...
)如果基于命令 (cmdlet,函数,脚本)调用的分配是,则只能使用明确地从命令推断类型定义的输出类型 :
[OutputType(<type>)]
属性。此外,由[pscustomobject]
返回的非描述性 ConvertFrom-Json
类型-不具有固有属性,只有那些您需要添加的属性;一个“财产袋”-您只能获得IntelliSense:
$var = [pscustomobject] @{ one = 1; two = 2 }
)中分配的
Visual Studio Code的IntelliSense(通过PowerShell扩展)确实可以识别通过PSv5 + this answer定义的 PS自定义类的实例的成员。
因此,您可以使用自定义类来镜像要加载的JSON对象的结构,并转换[pscustomobject]
“属性包由ConvertFrom-Json
通过 cast 返回到该类的实例。
注意:这种方法的固有局限性是您的类必须预见基础JSON对象包含的所有属性名称,并且这两个属性必须保持同步;否则:
class
的定义可以是:
class
statement从模块导入(请注意,使用Import-Module
不会加载模块的类)。要实施当前的解决方案,您可以通过以下两种方式之一使用class
定义:
(a)直接在脚本中定义一个与JSON对象的结构匹配的class
,并将从[pscustomobject]
返回的ConvertFrom-Json
实例转换为该类型;以这种方式分配的变量支持IntelliSense。
(b)将JSON加载功能包装在模块中,该模块在模块内部执行上述操作,并将class
实例从声明其[OutputObject()]
为该类型;然后,使用using module
导入该模块的代码将获得IntelliSense,以获取捕获该函数输出的变量。
(a)的简单演示:
# Define a class whose properties mirror the underlying JSON.
class Config {
$foo
$bar
}
# Load the JSON and cast the resulting [pscustomobject] to the class.
# Note: This cast only works if the JSON object's set of properties
# is either the same as that of the [Config] type or a subset of it.
[Config] $config = '{ "foo": "bar", "bar": 42 }' | ConvertFrom-Json
# Variable $config supports IntelliSense, because its is now known
# as type Config.
$config. # shows list of properties