Adding Iso8601TimeSpanConverter to JsonConverter l

2019-05-27 05:30发布

问题:

I'm using AutoRest to auto generate a c# class for a REST API from a Swagger definition file.

The problem is that when the client class initialize methos is executed, it throws an ArrayTypeMismatch exception in the following code:

SerializationSettings = new JsonSerializerSettings
{
    Formatting = Formatting.Indented,
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc,
    NullValueHandling = NullValueHandling.Ignore,
    ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
    ContractResolver = new ReadOnlyJsonContractResolver(),
    Converters = new List<JsonConverter>
        {
            new Iso8601TimeSpanConverter()
        }
}

The offending piece of code is the Iso8601TimeSpanConverter added to the list of JsonConverters.

BTW, this only happens when running this code in a VSIX package. On a standalone app, it works fine.

I wonder if it has to do with multiple versions of Newtonsoft.Json loading and colliding?

Any ideas?

回答1:

I encounter the same problem but finally get it resolve by using app.config to unify the Newtonsoft.Json binding.

<configuration>
  <runtime>
    <assemblyBinding>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

The issue is that Iso8601TimeSpanConverter might be inheriting a different version of JsonConverter than the one you are using on the AutoRest.