Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化JSON数组_C#_Json_Deserialization - Fatal编程技术网

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

我正在尝试使用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; }
    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);
}