JsonPoke 1.2.0

dotnet add package JsonPoke --version 1.2.0                
NuGet\Install-Package JsonPoke -Version 1.2.0                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="JsonPoke" Version="1.2.0" />                
对于支持 PackageReference 的项目,请将此 XML 节点复制到项目文件中以引用包。
paket add JsonPoke --version 1.2.0                
#r "nuget: JsonPoke, 1.2.0"                
#r 指令可用于 F# Interactive 和多语言笔记本。将其复制到交互工具或脚本的源代码中,以引用包。
// Install JsonPoke as a Cake Addin
#addin nuget:?package=JsonPoke&version=1.2.0

// Install JsonPoke as a Cake Tool
#tool nuget:?package=JsonPoke&version=1.2.0                

将值写入通过 JSONPath 选定的 JSON 节点

用法

  <JsonPoke ContentPath="[JSON_FILE]" Query="[JSONPath]" Value="[VALUE]" />
  <JsonPoke ContentPath="[JSON_FILE]" Query="[JSONPath]" RawValue="[JSON]" />
  <JsonPoke Content="[JSON]" Query="[JSONPath]" Value="[VALUE]" />

参数

参数 描述
内容 可选的 string 输入/输出参数。<br/>指定 JSON 输入作为字符串,并在任务执行成功后包含更新的 JSON。
ContentPath 可选的 ITaskItem 参数。<br/>指定 JSON 输入作为文件路径。
查询 必需的 string 参数。<br/>指定 JSONPath 表达式。
可选的 ITaskItem[] 参数。<br/>指定要插入到指定路径中的值(值)。
RawValue 可选的 string 参数。<br/>指定要插入到指定路径中的原始(JSON)值。

您必须通过 ContentPath 提供到 JSON 文件的路径,或通过 Content 提供原始 JSON 内容。

Value 可以是一个项目组,在这种情况下,它将作为一个数组插入到与 JSONPath 表达式 Query 匹配的 JSON 节点。可以不将其转换为 MSBuild 项,而使用 RawValue 提供整个 JSON 片段作为字符串。

现有 JSON 节点将确定要写入的值的类型,以便保留原始文档。在序列化到节点之前,数字、布尔值和日期时间值将正确解析。

    <PropertyGroup>
      <Json>
{
  "http": {
    "host": "localhost",
    "port": 80,
    "ssl": true
  }
}
      </Json>
    </PropertyGroup>

    <JsonPoke Content="$(Json)" Query="$.http.host" Value="example.com">
      <Output TaskParameter="Content" PropertyName="Json" />
    </JsonPoke>

    <JsonPoke Content="$(Json)" Query="$.http.port" Value="80">
      <Output TaskParameter="Content" PropertyName="Json" />
    </JsonPoke>

    <JsonPoke Content="$(Json)" Query="$.http.ssl" Value="true">
      <Output TaskParameter="Content" PropertyName="Json" />
    </JsonPoke>

    <Message Importance="high" Text="$(Json)" />

注意我们如何更新多个值并将更新的内容分配给相同的 $(Json) 属性,以便在后续更新中使用。最后一个 Message 任务将渲染以下 JSON

{
  "http": {
    "host": "example.com",
    "port": 80,
    "ssl": true
  }
}

注意:端口号作为数字保留,ssl 布尔值也是如此。

要将一个值强制解释为字符串,您可以用双引号或单引号将其包围。例如,给定以下JSON文件

{
    "http": {
        "ports": [
            "80"
        ]
    }
}

我们可以将`ports`数组替换为字符串值,如下所示(如果没有显式引号,值会被解释为数字):

  <ItemGroup>
    <HttpPort Include="'8080'" />
    <HttpPort Include="'1080'" />
  </ItemGroup>

  <JsonPoke ContentPath="http.json" Query="$.http.ports" Value="@(HttpPort)" />

结果

{
    "http": {
        "ports": [
            "8080", 
            "1080"
        ]
    }
}

还可以根据MSBuild项元数据编写复杂对象

   <ItemGroup>
     <Http Include="Value">
       <host>localhost</host>
       <port>80</port>
       <ssl>true</ssl>
     </Value>
   </ItemGroup>

   <JsonPoke ContentPath="http.json" Query="$.http" Value="@(Http)" Properties="host;port;ssl" />

结果

{
    "http": {
        "host": "localhost",
        "port": 80,
        "ssl": true
    }
}

注意,即使MSBuild中基本上都是字符串,也能自动推断出原生JSON类型。如上所述,您可以将任何项元数据值用双引号或单引号包围,以强制它们作为字符串写入。

如果路径表达式的任何部分找不到,该任务可以创建整个对象层次结构,这使得通过分配单个值来创建复杂结构变得非常容易。例如,如果上述示例中的`http`部分根本不存在,则在将`ssl`属性赋值为`true`之前,以下任务会自动添加它

<JsonPoke ContentPath="http.json" Query="$.http.ssl" Value="true" />

这同样适用于索引查询,例如通过简单地分配一个值将启动配置添加到launchSettings.json

<JsonPoke ContentPath="Properties\launchSettings.json" Query="$.profiles['IIS Express'].commandName" Value="IISExpress" />

这将创建以下条目

{
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
    }
  }
}

查询的一部分也支持数组索引,以修改现有值。如果数组为空或不存在,还可以仅使用索引[0]来表示新节点应该是新数组中的唯一元素,就像为host.json添加新的监视文件值一样

<JsonPoke ContentPath="host.json" Query="$.watchFiles[0]" Value="myFile.txt" />

这将导致

{
  ...
  "watchFiles": [ "myFile.txt" ]
}

通常想向现有数组添加条目,通常是在数组的末尾。JSONPath语法支持从数组末尾开始的索引(如[-1:]),但如果数组已有任何值,这会匹配最后一个元素,这意味着是更新该元素的价值。由于我们需要不同的语法来从列表末尾开始插入新节点,我们利用C#语法中的^n,其中n是从末尾开始的起始位置。要将新元素添加到列表末尾,可以使用索引[^1]^2表示在最后一个之前,依此类推。

例如,为了向上述示例中的数组添加新监视文件,我们可以使用

<JsonPoke ContentPath="host.json" Query="$.watchFiles[^1]" Value="myOtherFile.txt" />

给定一个如上所示的现有host.json文件,我们将得到如下添加的新文件

{
  ...
  "watchFiles": [ "myFile.txt", "myOtherFile.txt" ]
}

如果`watchFiles`属性根本不存在或者没有任何元素,结果将与使用`[0]`相同,但这使得在需要时代码更灵活。

可以使用Result任务属性将修改后的JSON节点分配给项名称,并将包含项路径(匹配Query加索引,如果修改了多个节点)以及包含原始JSON的Value项元数据

赞助商

Clarius Org Christian Findlay C. Augusto Proiete Kirill Osenkov MFB Technologies, Inc. SandRock Eric C Andy Gocke

Sponsor this project  

了解更多关于GitHub Sponsors的信息

此包中没有受支持的框架资产。

了解更多关于目标框架.NET Standard的信息。

此包没有依赖项。

NuGet软件包 (1)

显示此包依赖的顶部1个NuGet软件包

下载
SmallSharp

在同一个项目中创建、编辑和运行多个C#顶层程序 😍

GitHub仓库 (1)

显示此包依赖的顶部1个流行的GitHub仓库

仓库 星星
devlooped/SmallSharp
只需从启动按钮中选择启动程序,即可在同一个项目中创建、编辑和运行多个C#顶级程序。
版本 下载 上次更新
1.2.0 4,840 11/28/2022
1.1.9 2,304 9/23/2022
1.1.7 574 9/1/2022
1.1.6 20,869 8/5/2022
1.1.5 429 8/5/2022
1.1.4 414 8/5/2022
1.1.3 428 8/5/2022
1.1.2 438 8/5/2022
1.1.1 447 8/5/2022
1.1.0 2,252 2/3/2022
1.0.3 320 9/30/2021
1.0.2 360 9/15/2021