c# - 如何在 MS 构建任务中使用 NewtonSoft.json?

标签 c# .net json visual-studio msbuild

我有一个构建任务,我想在其中使用 newtonsoft.json 进行一些 json 序列化/反序列化,如下所示:

<UsingTask TaskName="ReplaceFileText" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
      <TargetFilename ParameterType="System.String" Required="true" />
      <SourceFilename ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
      <Reference Include="System.Core" />

      <Using Namespace="System" />
      <Using Namespace="System.IO" />

      <Code Type="Fragment" Language="cs">
        <![CDATA[

            string sourceJsonString = File.ReadAllText(SourceFilename);
            string targetJsonString = File.ReadAllText(TargetFilename);

            dynamic sourceJson = JsonConvert.DeserializeObject(sourceJsonString);
            dynamic targetJson = JsonConvert.DeserializeObject(targetJsonString);

            targetJson.firstProperty = sourceJson.firstProperty;
            targetJson.secondProperty = sourceJson.secondProperty;


            targetJsonString = JsonConvert.SerializeObject(targetJson, Formatting.Indented);

            File.WriteAllText(targetFilename, targetJsonString);

          ]]>
      </Code>
    </Task>
  </UsingTask>

  <Target Name="TransformsWithStaging" BeforeTargets="Build">
    <ReplaceFileText TargetFilename="$(ProjectDir)appsettings.json" SourceFilename="$(ProjectDir)appsettings.Staging.json" />
  </Target>

上面的代码不起作用,因为我在上面的任务中使用了 NewtonSoft.Json,这个构建任务中没有引用它。

如何在构建任务中导入或引用 NewtonSoft.Json。我正在使用 Visual Studio 2017 Professional、.NET Core 2.0 并且项目是 WebApi 应用程序?

最佳答案

得到它与以下工作:

<UsingTask TaskName="ReplaceFileText" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
      <TargetFilename ParameterType="System.String" Required="true" />
      <SourceFilename ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
      <Reference Include="System.Core" />
      <Reference Include="System.Runtime" />
      <Reference Include="System.Dynamic.Runtime" />
      <Reference Include="$(NugetPackageRoot)\microsoft.netcore.app\2.0.0\ref\netcoreapp2.0\System.ObjectModel.dll" />
      <Reference Include="$(NugetPackageRoot)\newtonsoft.json\10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll" />
      <Reference Include="$(NugetPackageRoot)\system.runtime.serialization.primitives\4.1.1\lib\netstandard1.3\System.Runtime.Serialization.Primitives.dll" />

      <Using Namespace="System" />
      <Using Namespace="System.IO" />
      <Using Namespace="System.Collections.Specialized" />
      <Using Namespace="Newtonsoft.Json" />
      <Using Namespace="Newtonsoft.Json.Linq" />

      <Code Type="Fragment" Language="cs">
        <![CDATA[

            string sourceJsonString = File.ReadAllText(SourceFilename);
            string targetJsonString = File.ReadAllText(TargetFilename);

            JObject sourceJsonObject = JObject.Parse(sourceJsonString);
            JObject targetJsonObject = JObject.Parse(targetJsonString);

            targetJsonObject["someProperty"] = sourceJsonObject["someProperty"];

            File.WriteAllText(TargetFilename, targetJsonObject.ToString());

          ]]>
      </Code>
    </Task>
  </UsingTask>

  <Target Name="TransformsWithDevelopment" Condition="'$(Configuration)'=='Development'" BeforeTargets="Build">
    <ReplaceFileText TargetFilename="$(ProjectDir)appsettings.json" SourceFilename="$(ProjectDir)appsettings.Development.json" />
  </Target>

  <Target Name="TransformsWithStaging" Condition="'$(Configuration)'=='Staging'" BeforeTargets="Build">
    <ReplaceFileText TargetFilename="$(ProjectDir)appsettings.json" SourceFilename="$(ProjectDir)appsettings.Staging.json" />
  </Target>

  <Target Name="TransformsWithProduction" Condition="'$(Configuration)'=='Production'" BeforeTargets="Build">
    <ReplaceFileText TargetFilename="$(ProjectDir)appsettings.json" SourceFilename="$(ProjectDir)appsettings.Production.json" />
  </Target>

关于c# - 如何在 MS 构建任务中使用 NewtonSoft.json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47869999/

相关文章:

c# - MongoDB C# 驱动程序 'Remote certificate is invalid'

c# - WPF 控件初始化时未更新属性

c# - 将 .NET 结构与 WINAPI 函数结合使用

Javascript:TypeError:循环对象值

c# - 检测并处理应用程序突然结束任务、重启和关闭?

javascript - 如何避免让 ASHX 处理程序受到滥用?

c# - 如何为 Outlook AppointmentItem 的类别着色

.net - 有没有办法避免 XmlSerializer 在反序列化时不初始化 null 属性?

json - 重用 JSON 子模式

php - 即使 JSON 响应正常,仍然收到 JSONException : Value &lt;! DOCTYPE 类型错误