使用 MSBuild 将多个 JSON 文件合并为一个 JSON 文件
Merge multiple JSON files into one JSON file using MSBuild
在我的 ASP.NET MVC Web 项目中,我有许多 JSON 文件。
File1.json
{
"manage_employees_section_title":
{
"value": "Manage employees",
"description": "The mange employees section title"
}
}
File2.json
{
"manage_operations_section_title":
{
"value": "Manage operations
"description": "The mange operations section title"
}
}
作为构建过程的一部分,我需要获取所有 JSONs
并合并到一个文件中。
我曾经这样使用过MSBuild。
<Target Name="ConcatenateJsFiles">
<ItemGroup>
<ConcatFiles Include="Application\**\resource-content*.json"/>
</ItemGroup>
<ReadLinesFromFile File="%(ConcatFiles.Identity)">
<Output TaskParameter="Lines" ItemName="ConcatLines"/>
</ReadLinesFromFile>
<WriteLinesToFile File="Infrastructure\Content\Store\ContentStore.json" Lines="@(ConcatLines)" Overwrite="true" />
</Target>
这就是我得到的...
Concat.json
//What I got
{
"manage_employees_section_title":
{
"value": "Manage employees",
"description": "The mange employees section title"
}
}
{
"manage_operations_section_title":
{
"value": "Manage operations
"description": "The mange operations section title"
}
}
尽管我已经实现了串联的目标,但我真正想要的是将所有 JSON
个文件合并到一个 JSON
对象中。
//What I really want
{
"manage_employees_section_title":
{
"value": "Manage employees",
"description": "The mange employees section title"
},
"manage_operations_section_title":
{
"value": "Manage operations
"description": "The mange operations section title"
}
}
如何在 Visual Studio.
的构建过程中实现这一目标
非常感谢你们..
您可以做的一件事是创建一个小型 C# 应用程序并将其添加到您的预构建过程中:
创建一个接受目录参数的应用程序。您可以使用 .NET JSON 解析 System.Runtime.Serialization.DataContractJsonSerializer 中的 类 从每个 JSON 文件中获取对象。根据您的描述,听起来您已经可以成功解析对象了。
将所有对象放入一个集合并将输出序列化到一个文件中。当 运行 连接多个 VS 实例时,您可能 运行 遇到文件访问问题,因此请为您的文件命名。
将您的应用程序添加到 visual studio 中的 Properties > Build Events > Pre-build Event Command Line。您可以使用 visual studio 中包含的一些构建宏在构建时确定工作目录。例如,MyApp.exe $(ProjectDir) 将传递项目目录的参数,如果您有多个区域,该参数将在构建时决定。
-MF
仅使用 MSBuild 功能获得结果是一项有趣的任务...老实说,为此目标创建额外的 C# 应用程序是更好的方法。但我也能用 MSBuild 做到这一点:
<Project ToolsVersion="12.0" DefaultTargets="ConcatenateJsFiles" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<Target Name="ConcatenateJsFiles">
<ItemGroup>
<ConcatFiles Include="Application\**\resource-content*.json"/>
</ItemGroup>
<ItemGroup>
<!-- Read file content (with spaces preserving), remove trailing { and } -->
<ContentLines Include="$([System.IO.File]::ReadAllText('%(ConcatFiles.Identity)').Remove($([MSBuild]::Subtract($([System.IO.File]::ReadAllText('%(ConcatFiles.Identity)').Length), 1)), 1).Remove(0, 1))"/>
<!-- Create resulting file with trailing { and } -->
<FileContent Include="{"/>
<FileContent Include="@(ContentLines, ',%0a')"/>
<FileContent Include="}"/>
</ItemGroup>
<WriteLinesToFile File="ContentStore.json" Lines="@(FileContent)" Overwrite="true" />
</Target>
</Project>
因此您将拥有以下文件:
{
"manage_employees_section_title":
{
"value": "Manage employees",
"description": "The mange employees section title"
},
"manage_operations_section_title":
{
"value": "Manage operations",
"description": "The mange operations section title"
}
}
这种方法不够灵活,例如它要求尾括号位于源文件的第一个和最后一个位置。无论如何,仅演示如何使用 MBSuild 就足够了。
在我的 ASP.NET MVC Web 项目中,我有许多 JSON 文件。
File1.json
{
"manage_employees_section_title":
{
"value": "Manage employees",
"description": "The mange employees section title"
}
}
File2.json
{
"manage_operations_section_title":
{
"value": "Manage operations
"description": "The mange operations section title"
}
}
作为构建过程的一部分,我需要获取所有 JSONs
并合并到一个文件中。
我曾经这样使用过MSBuild。
<Target Name="ConcatenateJsFiles">
<ItemGroup>
<ConcatFiles Include="Application\**\resource-content*.json"/>
</ItemGroup>
<ReadLinesFromFile File="%(ConcatFiles.Identity)">
<Output TaskParameter="Lines" ItemName="ConcatLines"/>
</ReadLinesFromFile>
<WriteLinesToFile File="Infrastructure\Content\Store\ContentStore.json" Lines="@(ConcatLines)" Overwrite="true" />
</Target>
这就是我得到的...
Concat.json
//What I got
{
"manage_employees_section_title":
{
"value": "Manage employees",
"description": "The mange employees section title"
}
}
{
"manage_operations_section_title":
{
"value": "Manage operations
"description": "The mange operations section title"
}
}
尽管我已经实现了串联的目标,但我真正想要的是将所有 JSON
个文件合并到一个 JSON
对象中。
//What I really want
{
"manage_employees_section_title":
{
"value": "Manage employees",
"description": "The mange employees section title"
},
"manage_operations_section_title":
{
"value": "Manage operations
"description": "The mange operations section title"
}
}
如何在 Visual Studio.
的构建过程中实现这一目标非常感谢你们..
您可以做的一件事是创建一个小型 C# 应用程序并将其添加到您的预构建过程中:
创建一个接受目录参数的应用程序。您可以使用 .NET JSON 解析 System.Runtime.Serialization.DataContractJsonSerializer 中的 类 从每个 JSON 文件中获取对象。根据您的描述,听起来您已经可以成功解析对象了。
将所有对象放入一个集合并将输出序列化到一个文件中。当 运行 连接多个 VS 实例时,您可能 运行 遇到文件访问问题,因此请为您的文件命名。
将您的应用程序添加到 visual studio 中的 Properties > Build Events > Pre-build Event Command Line。您可以使用 visual studio 中包含的一些构建宏在构建时确定工作目录。例如,MyApp.exe $(ProjectDir) 将传递项目目录的参数,如果您有多个区域,该参数将在构建时决定。
-MF
仅使用 MSBuild 功能获得结果是一项有趣的任务...老实说,为此目标创建额外的 C# 应用程序是更好的方法。但我也能用 MSBuild 做到这一点:
<Project ToolsVersion="12.0" DefaultTargets="ConcatenateJsFiles" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<Target Name="ConcatenateJsFiles">
<ItemGroup>
<ConcatFiles Include="Application\**\resource-content*.json"/>
</ItemGroup>
<ItemGroup>
<!-- Read file content (with spaces preserving), remove trailing { and } -->
<ContentLines Include="$([System.IO.File]::ReadAllText('%(ConcatFiles.Identity)').Remove($([MSBuild]::Subtract($([System.IO.File]::ReadAllText('%(ConcatFiles.Identity)').Length), 1)), 1).Remove(0, 1))"/>
<!-- Create resulting file with trailing { and } -->
<FileContent Include="{"/>
<FileContent Include="@(ContentLines, ',%0a')"/>
<FileContent Include="}"/>
</ItemGroup>
<WriteLinesToFile File="ContentStore.json" Lines="@(FileContent)" Overwrite="true" />
</Target>
</Project>
因此您将拥有以下文件:
{
"manage_employees_section_title":
{
"value": "Manage employees",
"description": "The mange employees section title"
},
"manage_operations_section_title":
{
"value": "Manage operations",
"description": "The mange operations section title"
}
}
这种方法不够灵活,例如它要求尾括号位于源文件的第一个和最后一个位置。无论如何,仅演示如何使用 MBSuild 就足够了。