如何创建C#类来反序列化以方括号开头和结尾的JSON字符串
我从API收到一个JSON字符串,希望将其反序列化为C#对象,但无法获得正确的类 我曾尝试使用创建类,但它无法解析JSON,但表示JSON是有效的 我也试过跑步,但这说明 无法将Newtonsoft.Json.Linq.JValue类型的对象强制转换为Newtonsoft.Json.Linq.JObject 这似乎是一个问题,因为JSON包含在如何创建C#类来反序列化以方括号开头和结尾的JSON字符串,c#,json,json.net,C#,Json,Json.net,我从API收到一个JSON字符串,希望将其反序列化为C#对象,但无法获得正确的类 我曾尝试使用创建类,但它无法解析JSON,但表示JSON是有效的 我也试过跑步,但这说明 无法将Newtonsoft.Json.Linq.JValue类型的对象强制转换为Newtonsoft.Json.Linq.JObject 这似乎是一个问题,因为JSON包含在[]方括号中。我相信这是有效的,但它使它成为一个数组。我想我需要一个数组 string Json = @"[""error"",{""code"":2,"
[]
方括号中。我相信这是有效的,但它使它成为一个数组。我想我需要一个数组
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; }
}
string Json=@“[”错误“,{”“代码”“:2”,“消息”“:”“此API密钥无效”“}]”;
var obj=JsonConvert.DeserializeObject(Json);
公共类代码msg
{
[JsonProperty(“代码”)]
公共长代码{get;set;}
[JsonProperty(“msg”)]
公共字符串Msg{get;set;}
}
公开课成绩
{
[JsonProperty(“错误”)]
公共字符串{get;set;}
公共代码msg cm{get;set;}
}
公共类根对象
{
公共结果结果{get;set;}
}
我总是犯错误
无法将当前JSON数组(例如[1,2,3])反序列化为类型“ConsoleApp1.RootObject”,因为该类型需要一个JSON对象(例如{“name”:“value”})才能正确反序列化。
要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”}),或将反序列化类型更改为数组或实现集合接口(例如ICollection,IList)的类型,如可以从JSON数组反序列化的列表
试试这个:
var obj = JsonConvert.DeserializeObject<List<Result>>(Json);
var obj=JsonConvert.DeserializeObject(Json);
说明:如果JSON是一个数组,那么C#RootObject必须从List/IEnumerable本身派生,或者将其反序列化为该类型的List/Array
您可以转储
RootObject
类。如果要使用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()
dynamic obj= new JsonConver.DeserializeObject<List<JsonHolder>>(StrJson);
公共类JsonHolder
{
公共字符串Id{get;set;}
公共字符串名称{get;set;}
公共字符串{get;set;}
}
var jsonHolderList=新的JsonConvert.DeserializeObject(jsonString);
var jsonHolder=jsonHolderList.Single()
您还可以将json字符串转换为c#对象作为动态对象。只需确保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()
dynamic obj= new JsonConver.DeserializeObject<List<JsonHolder>>(StrJson);
dynamic obj=新的JsonConver.DeserializeObject(StrJson);
您的JSON是一个包含字符串和对象的异构数组。如果没有一点帮助,这将不会干净地反序列化到强类型类结构中。一种可能的解决方案是使用如下自定义设置:
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(typeof(ResultConverter))]
public class Result
{
public string String { get; set; }
public CodeMsg cm { get; set; }
}
var result = JsonConvert.DeserializeObject<Result>(Json);
最后,将JSON反序列化到Result
类中,如下所示:
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(typeof(ResultConverter))]
public class Result
{
public string String { get; set; }
public CodeMsg cm { get; set; }
}
var result = JsonConvert.DeserializeObject<Result>(Json);
var result=JsonConvert.DeserializeObject(Json);
工作演示:
注意:您可以删除
RootObject
类;这里不需要它。最好是引用错误消息:将反序列化类型更改为数组或实现集合接口的类型
只需确保,您的json字符串必须具有与JsonHolder类相同的属性。只有代码的答案被认为是低质量的:请确保提供代码的功能以及如何解决问题的解释。我已将您的评论移到正文中-请删除您的评论(我无法)。然后,将值“Error”转换为类型“ConsoleApp1.Result”时,会出现此错误。路径“[0]”,第1行,位置8。
能否将结果
类型括在括号中,以便将其解释为连贯的对象<代码>@“[{”“错误”“{”“代码”“:2”“消息”“:”“此API密钥无效”“}}]”代码>我刚刚意识到你表达的是一个or类型(我想你可以称之为有区别的联合):要么是字符串“error”,要么是对象“CodeMsg”。你不能用C来表达这一点。因此,我建议使用对象语法。