C# 反序列化JSON数组
我正在尝试使用Newtonsoft名称空间反序列化C#中的JSON数据 以下是我的课程:C# 反序列化JSON数组,c#,json,deserialization,C#,Json,Deserialization,我正在尝试使用Newtonsoft名称空间反序列化C#中的JSON数据 以下是我的课程: class lastResponse { public string type { get; set; } public Metadata metadata { get; set; } // public string[] course { get; set; } public List<object> course { get; set; } publi
class lastResponse
{
public string type { get; set; }
public Metadata metadata { get; set; }
// public string[] course { get; set; }
public List<object> course { get; set; }
public string publisher { get; set; }
}
public class Metadata
{
public string bookID { get; set; }
public string title { get; set; }
public string filename { get; set; }
}
类响应
{
公共字符串类型{get;set;}
公共元数据{get;set;}
//公共字符串[]课程{get;set;}
公共列表课程{get;set;}
公共字符串发布程序{get;set;}
}
公共类元数据
{
公共字符串bookID{get;set;}
公共字符串标题{get;set;}
公共字符串文件名{get;set;}
}
此代码:
var errorMsg = JsonConvert.DeserializeObject<lastResponse>(downloader.LastResponse);
var errorMsg=JsonConvert.DeserializeObject(downloader.LastResponse);
给我这个错误:
Newtonsoft.Json.dll中出现未经处理的“Newtonsoft.Json.JsonSerializationException”类型的异常。其他信息:无法将当前Json数组(例如[1,2,3])反序列化为“BookManager.lastResponse”类型,因为该类型需要一个Json对象(例如{“name”:“value”})才能正确反序列化
请帮我找出我这里缺少的内容。最可能的原因可能是您从
下载程序获得的json。LastResponse
不是数组
您的Json可能是这样的
{
"type": "First",
"metadata": {
"bookID": "book123",
"title": "bookTitle Here",
"filename": "book file name"
},
"course": [
{
"1": "01",
"2": "02"
},
{
"001": "001",
"002": "002"
}
],
"publisher": "you"
}
您需要更改的是在downloader.LastResponse
中传递JSON数组,或者您可以如下更改您的反序列化对象语句
JsonConvert.DeserializeObject<lastResponse>(downloader.LastResponse);
这可能会解决您的问题:)您可以使用
string s=“YouJsonText”;
var serializer=新的JavaScriptSerializer();
var result=序列化程序。反序列化;
//或
YouCustomClass res=serializer.Deserialize(sb.ToString());
此外,您还可以像这样使用CustomJsonConverter:
public class YouCustomClassConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}
//and first you need register type, which you want Deserialize
public override IEnumerable<Type> SupportedTypes
{
get { return new[] { typeof(YouCustomClass ) }; }
}
}
//and then example of using JavaScriptSerializer with custom converter
var ser = new JavaScriptSerializer();
ser.RegisterConverters(new JavaScriptConverter[] { new YouCustomClassConverter() });
try
{
YouCustomClass obj = ser.Deserialize(jsonString);
}
公共类YouCustomClassConverter:JavaScriptConverter
{
公共重写对象反序列化(IDictionary dictionary、类型、JavaScriptSerializer序列化程序)
{
抛出新的NotImplementedException();
}
公共重写IDictionary序列化(对象obj、JavaScriptSerializer序列化程序)
{
抛出新的NotImplementedException();
}
//首先需要寄存器类型,您需要反序列化它
公共覆盖IEnumerable SupportedTypes
{
获取{returnnew[]{typeof(YouCustomClass)};}
}
}
//然后是将JavaScriptSerializer与自定义转换器一起使用的示例
var ser=新的JavaScriptSerializer();
ser.RegisterConverters(新JavaScriptConverter[]{new YouCustomClassConverter()});
尝试
{
YouCustomClass obj=ser.Deserialize(jsonString);
}
注意:您需要使用
使用System.Web.Script.Serialization
你能显示downloader.LastResponse
这个字符串吗
我试图更改反序列化语句,但它给了我这个错误“Newtonsoft.Json.Json序列化异常”类型的未处理异常发生在Newtonsoft.Json.dll中其他信息:无法反序列化当前Json数组(例如[1,2,3])输入类型“BookManager.lastResponse”,因为该类型需要一个JSON对象(例如{“name”:“value”})才能正确地反序列化。“”和从下载程序返回的jason。最后一个响应与第一个响应中的示例类似block@SthokoManqele你能分享你的json吗?{“类型”:“书籍”,“元数据”:{“bookID”:“book-000f6b3e-f616-4417-b1b8-66f375e3e4b4”,“标题”:“交互式资产测试书”,“文件名”:“交互式演示”,},“课程”:[“301 Lieb演示”],“发布者”:“ITS”,}@SthokoManqele您的JSON无效。首先验证它。正确的JSON是{“type”:“book”,“metadata”:{“bookID”:”book-000f6b3e-f616-4417-b1b8-66f375e3e4b4,“title:“Interactive Asset Test book”,“filename:“Interactive Demo”},“course:[“301 Lieb Demo”],“publisher:“ITS”}
您可以在downloader上验证json。lastResponse返回有效的json,这是一个示例。我只是从代码中省略了一些内容,因为我正在处理复杂的数据
string s = "YouJsonText";
var serializer = new JavaScriptSerializer();
var result = serializer.Deserialize(s);
//or
YouCustomClass res = serializer.Deserialize<YouCustomClass>(sb.ToString());
public class YouCustomClassConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}
//and first you need register type, which you want Deserialize
public override IEnumerable<Type> SupportedTypes
{
get { return new[] { typeof(YouCustomClass ) }; }
}
}
//and then example of using JavaScriptSerializer with custom converter
var ser = new JavaScriptSerializer();
ser.RegisterConverters(new JavaScriptConverter[] { new YouCustomClassConverter() });
try
{
YouCustomClass obj = ser.Deserialize(jsonString);
}