我正在从API接收到JSON字符串,并想将其反序列化为C#对象,但无法正确获取类。
我尝试使用http://json2csharp.com/创建类,但是无法解析JSON,但是https://jsonlint.com/表示JSON有效。
我也尝试过运行JsonClassGeneratorLib,但这表示
无法将类型为Newtonsoft.Json.Linq.JValue的对象转换为Newtonsoft.Json.Linq.JObject
这似乎是一个问题,因为JSON包含在[]
方括号中。我相信这是有效的,但可以将其放入数组。我想我班上的某个地方需要一个数组。
string Json = @"[""error"",{""code"":2,""msg"":""This API Key is invalid""}]";
var obj = JsonConvert.DeserializeObject<RootObject>(Json);
public class CodeMsg
{
[JsonProperty("code")]
public long Code { get; set; }
[JsonProperty("msg")]
public string Msg { get; set; }
}
public class Result
{
[JsonProperty("error")]
public string String { get; set; }
public CodeMsg cm { get; set; }
}
public class RootObject
{
public Result Result { get; set; }
}
我总是会收到错误
无法将当前JSON数组(例如[1,2,3])反序列化为类型'ConsoleApp1.RootObject',因为该类型需要JSON对象(例如{“ name”:“ value”})才能正确反序列化。 要解决此错误,可以将JSON更改为JSON对象(例如{“ name”:“ value”}),也可以将反序列化类型更改为数组,或者将实现集合接口的类型(例如ICollection,IList)更改为{{1 }}可以从JSON数组反序列化
答案 0 :(得分:2)
尝试一下:
var obj = JsonConvert.DeserializeObject<List<Result>>(Json);
说明:如果JSON是数组,则C#RootObject必须要么从List / IEnumberable本身派生,要么将其反序列化为类型的List / Array。
您可以转储RootObject
类。如果要使用RootObject
类型,请使其从List派生。但这不值得麻烦。
答案 1 :(得分:1)
您的JSON是包含字符串和对象的异构数组。在没有一点帮助的情况下,这不会干净地反序列化为强类型的类结构。一种可能的解决方案是使用自定义JsonConverter
,如下所示:
public class ResultConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Result);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JArray array = JArray.Load(reader);
Result result = new Result
{
String = array[0].Value<string>(),
cm = array[1].ToObject<CodeMsg>(serializer)
};
return result;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后使用如下所示的Result
属性将转换器绑定到您的[JsonConverter]
类:
[JsonConverter(typeof(ResultConverter))]
public class Result
{
public string String { get; set; }
public CodeMsg cm { get; set; }
}
最后,像这样将JSON反序列化为Result
类:
var result = JsonConvert.DeserializeObject<Result>(Json);
正在运行的演示:https://dotnetfiddle.net/RLpm5W
注意:您可以删除RootObject
类;这里不需要。
答案 2 :(得分:0)
只需确保您的json字符串必须具有与JsonHolder类相同的属性。
public class JsonHolder
{
public string Id {get;set;}
public string Name {get;set;}
public string Gender {get;set;}
}
var jsonHolderList = new JsonConvert.DeserializeObject<List<JsonHolder>>(jsonString);
var jsonHolder = jsonHolderList.Single()
您还可以将json字符串转换为c#对象作为动态对象。只需确保您的json字符串必须具有与JsonHolder类相同的属性即可。
dynamic obj= new JsonConver.DeserializeObject<List<JsonHolder>>(StrJson);