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在这里复制了当然,让我试着给你更新一下。你有机会看到小提琴吗?