C# 无法转换字符串';名称';to dictionary key type-创建一个TypeConverter,将字符串转换为key type对象

C# 无法转换字符串';名称';to dictionary key type-创建一个TypeConverter,将字符串转换为key type对象,c#,json,serialization,json.net,deserialization,C#,Json,Serialization,Json.net,Deserialization,我试图在下面反序列化json { "Settings": { "ServiceUrl": "http://www.somethingsample.sample", "FrequencyOfSchedulerInMinutes": 6 }, "ApplicationLog": { "Serilog": { "MinimumLevel": "Information", "WriteTo": [ { "N

我试图在下面反序列化
json

  {
   "Settings": {
   "ServiceUrl": "http://www.somethingsample.sample",
   "FrequencyOfSchedulerInMinutes": 6    
  },

 "ApplicationLog": {
   "Serilog": {
      "MinimumLevel": "Information",
      "WriteTo": [
       {
        "Name": "RollingFile",
        "Args": {
           "pathFormat": "%PROGRAMDATALog.txt",
           "fileSizeLimitBytes": 10485760,
           "retainedFileCountLimit": 10,
           "rollingInterval": "Day",
           "outputTemplate": "== {Timestamp:yy}{Exception}"
       }
     }
    ]
   }
  }   
}
c#类是

  public class Settings
  {
      [JsonProperty("ServiceUrl")]
      public string ServiceUrl { get; set; }

      [JsonProperty("FrequencyOfSchedulerInMinutes")]
      public int FrequencyOfSchedulerInMinutes { get; set; }

  }

  public class Args
  {
      [JsonProperty("pathFormat")]
      public string pathFormat { get; set; }

      [JsonProperty("fileSizeLimitBytes")]
      public int fileSizeLimitBytes { get; set; }

      [JsonProperty("retainedFileCountLimit")]
      public int retainedFileCountLimit { get; set; }

      [JsonProperty("rollingInterval")]
      public string rollingInterval { get; set; }

      [JsonProperty("outputTemplate")]
      public string outputTemplate { get; set; }
   }

   public class WriteTo
   {
      [JsonProperty("Name")]
      public string Name { get; set; }

      [JsonProperty("Args")]
      public Args Args { get; set; }
   }

   public class Serilog
   {
       [JsonProperty("MinimumLevel ")]
       public string MinimumLevel { get; set; }

       [JsonProperty("WriteTo")]
       public List<Dictionary<WriteTo, object>> WriteTo { get; set; }

   }

  public class ApplicationLog
  {
       [JsonProperty("Serilog")]
       public Serilog Serilog { get; set; }
  }

  public class RootObject
  {
      public Settings Settings { get; set; }
      public ApplicationLog ApplicationLog { get; set; }
  }
公共类设置
{
[JsonProperty(“ServiceUrl”)]
公共字符串ServiceUrl{get;set;}
[JsonProperty(“FrequencyOfSchedulerInMinutes”)]
public int FrequencyOfSchedulerInMinutes{get;set;}
}
公共类Args
{
[JsonProperty(“路径格式”)]
公共字符串路径格式{get;set;}
[JsonProperty(“fileSizeLimitBytes”)]
public int fileSizeLimitBytes{get;set;}
[JsonProperty(“retainedFileCountLimit”)]
public int retainedFileCountLimit{get;set;}
[JsonProperty(“rollingInterval”)]
公共字符串rollingInterval{get;set;}
[JsonProperty(“outputTemplate”)]
公共字符串输出模板{get;set;}
}
公共类书面语
{
[JsonProperty(“名称”)]
公共字符串名称{get;set;}
[JsonProperty(“Args”)]
公共Args Args{get;set;}
}
公共类Serilog
{
[JsonProperty(“最低级别”)]
公共字符串最小级别{get;set;}
[JsonProperty(“WriteTo”)]
公共列表写入{get;set;}
}
公共类应用程序日志
{
[JsonProperty(“Serilog”)]
公共Serilog Serilog{get;set;}
}
公共类根对象
{
公共设置{get;set;}
公共应用程序日志应用程序日志{get;set;}
}
这是我的解析器

  class DictionaryAsArrayResolver : DefaultContractResolver
  {
    protected override JsonContract CreateContract(Type objectType)
    {
        if (objectType.GetInterfaces().Any(i => i == typeof(IDictionary) ||
                                                (i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IDictionary<,>))))
        {
            return base.CreateArrayContract(objectType);
        }

        return base.CreateContract(objectType);
     }
  }
类字典ArrayResolver:DefaultContractResolver
{
受保护的重写JsonContract CreateContract(类型objectType)
{
if(objectType.GetInterfaces().Any)(i=>i==typeof(IDictionary)||
(i.IsGenericType&&i.GetGenericTypeDefinition()==typeof(IDictionary)))
{
返回base.CreateArrayContract(objectType);
}
返回base.CreateContract(objectType);
}
}
这就是我进行反序列化的方式

  JsonSerializerSettings settings = new JsonSerializerSettings();
  settings.ContractResolver = new DictionaryAsArrayResolver();

   var objectValue = JsonConvert.DeserializeObject<Dictionary<string, object>>(json, settings);
   var items = JsonConvert.DeserializeObject<RootObject>(objectValue.Values.First().ToString(), settings);
JsonSerializerSettings设置=新建JsonSerializerSettings();
settings.ContractResolver=新字典ArrayResolver();
var objectValue=JsonConvert.DeserializeObject(json,设置);
var items=JsonConvert.DeserializeObject(objectValue.Values.First().ToString(),设置);
我正在犯错误

运行时异常(第39行):无法将当前JSON对象(例如{“名称”:“值”})反序列化为类型“System.Collections.Generic.Dictionary`2[System.String,System.object]”,因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。 若要修复此错误,请将JSON更改为JSON数组(例如[1,2,3]),或更改反序列化类型,使其成为可以从JSON对象反序列化的正常.NET类型(例如,不是integer之类的基元类型,也不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到类型中,以强制它从JSON对象反序列化。 路径“设置”,第2行,位置13

{“无法将字符串“Name”转换为字典键类型“MyProject.WriteTo”。请创建一个TypeConverter以将字符串转换为键类型对象。路径“ApplicationLog.Serilog.WriteTo[0]。名称”,第21行,位置17。“}


将object
WriteTo
作为字典键似乎有点奇怪。但将
Serilog
更改为:

public class Serilog
{
    [JsonProperty("MinimumLevel ")]
    public string MinimumLevel { get; set; }

    [JsonProperty("WriteTo")]
    public List<WriteTo> WriteTo { get; set; }
}
公共类Serilog
{
[JsonProperty(“最低级别”)]
公共字符串最小级别{get;set;}
[JsonProperty(“WriteTo”)]
公共列表写入{get;set;}
}
可以在没有ContractResolver的情况下反序列化它

var rootObject = JsonConvert.DeserializeObject<RootObject>(json);
var rootObject=JsonConvert.DeserializeObject(json);

可能重复您的问题中没有显示类型
AppSettings
,所以
JsonConvert.DeserializeObject?还有,JSON的哪个部分是
(objectValue.Values.First().ToString()
应该指的?@dbc抱歉,这是一个打字错误。更新的问题。@dbc在这里复制了当然,让我试着给你更新一下。你有机会看到小提琴吗?