JsonPoke 1.2.0
dotnet add package JsonPoke --version 1.2.0
NuGet\Install-Package JsonPoke -Version 1.2.0
<PackageReference Include="JsonPoke" Version="1.2.0" />
paket add JsonPoke --version 1.2.0
#r "nuget: JsonPoke, 1.2.0"
// 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
项元数据
赞助商
此包没有依赖项。
NuGet软件包 (1)
显示此包依赖的顶部1个NuGet软件包
包 | 下载 |
---|---|
SmallSharp
在同一个项目中创建、编辑和运行多个C#顶层程序 😍 |
GitHub仓库 (1)
显示此包依赖的顶部1个流行的GitHub仓库
仓库 | 星星 |
---|---|
devlooped/SmallSharp
只需从启动按钮中选择启动程序,即可在同一个项目中创建、编辑和运行多个C#顶级程序。
|