[英]How to create C# classes to deserialize a JSON string which starts and ends with square brackets
我从 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)的类型,如
List<T>
可以从 JSON 数组反序列化
试试这个:
var obj = JsonConvert.DeserializeObject<List<Result>>(Json);
说明:如果 JSON 是数组,则 C# RootObject 必须从 List/IEnumerable 本身派生,或者将其反序列化为类型的列表/数组。
您可以转储您的RootObject
类。 如果您想使用RootObject
类型,请将其派生自 List。 但这不值得麻烦。
您的 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();
}
}
然后使用[JsonConverter]
属性将转换器绑定到您的Result
类,如下所示:
[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
类; 这里不需要。
请确保您的 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.