使用正确的自动完成(IntelliSense)将JSON转换为PowerShell

时间:2019-04-03 16:07:36

标签: json powershell visual-studio-code

当我读取json文件并将其转换为类似PowerShell的文件时,是否有一种方法可以使Visual Studio Code中的IntelliSense自动完成正常工作

from()

问题在于文件必须先在内存中才能从json文件中获取结构并提出属性。

如果我拿出代码并在powershell终端中执行它,然后返回到代码编辑器,则自动补全工作正常。

2 个答案:

答案 0 :(得分:2)

当前IntelliSense不能执行此操作。

某些原因是因为在编码时,通常指定的文件可能不存在,测试版本不同于预期的版本,文件可能很大,格式不正确等。默认情况下,有时安全不这样做。

通过在终端中运行它并将其加载到内存中,您将明确告诉IntelliSense您正在使用什么,然后它现在“了解”该对象,然后可以正确建议正确的属性和属性。

正如@ mklement0所建议的那样,使用键盘快捷键F8将在集成终端中方便地执行当前行/选择,这会将对象加载到内存中,并允许您在编辑器中使用IntelliSense。

答案 1 :(得分:1)

补充HAL9256's helpful answer

首先,一些背景信息;在底部找到可行的解决方案。

Visual Studio Code中变量的智能感知,如果它们的类型为:

  • 明确声明(例如[datetime] $var = ...
  • 或可以从分配的值推断

如果基于命令 (cmdlet,函数,脚本)调用的分配是,则只能使用明确地从命令推断类型定义的输出类型

  • 很多,但绝不是全部, cmdlet 确实声明了它们的输出类型
  • 功能脚本必须使用[OutputType(<type>)]属性。

此外,由[pscustomobject]返回的非描述性 ConvertFrom-Json类型-不具有固有属性,只有那些您需要添加的属性;一个“财产袋”-您只能获得IntelliSense:

  • 如果变量是从自定义对象 literal (例如$var = [pscustomobject] @{ one = 1; two = 2 })中分配的
  • 如果您将自定义对象投射到特定类型 ,则假定可以从自定义对象的属性构造该类型的实例,那么PowerShell可以轻松实现这一点-请参见{ {3}}。

使用自定义类别(PSv5 +)的解决方案

Visual Studio Code的IntelliSense(通过PowerShell扩展)确实可以识别通过PSv5 + this answer定义的 PS自定义类的实例的成员。

因此,您可以使用自定义类来镜像要加载的JSON对象的结构,并转换[pscustomobject]“属性包由ConvertFrom-Json通过 cast 返回到该类的实例

注意:这种方法的固有局限性是您的类必须预见基础JSON对象包含的所有属性名称,并且这两个属性必须保持同步;否则:

  • 如果JSON端的属性名称​​更改,则如果未相应更新类定义,您的代码将中断
  • 如果在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