Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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# 在c语言中反序列化json数组列表_C#_Asp.net_Json_Deserialization - Fatal编程技术网

C# 在c语言中反序列化json数组列表

C# 在c语言中反序列化json数组列表,c#,asp.net,json,deserialization,C#,Asp.net,Json,Deserialization,我正在从事一个以C为后端的项目,但我不是一个有经验的C开发人员,所以我无法找到解决对象列表json反序列化问题的方法。以下函数负责反序列化,但我得到一个错误: using System.IO; using System.Web; using Raven.Imports.Newtonsoft.Json; namespace Corina.Web.Handlers { public class JsonRequestHandler { public T Handle

我正在从事一个以C为后端的项目,但我不是一个有经验的C开发人员,所以我无法找到解决对象列表json反序列化问题的方法。以下函数负责反序列化,但我得到一个错误:

using System.IO;
using System.Web;
using Raven.Imports.Newtonsoft.Json;

namespace Corina.Web.Handlers
{
    public class JsonRequestHandler
    {
        public T Handle<T>(HttpContextBase context)
        {
            string requestData;

            context.Request.InputStream.Position = 0;
            using (var inputStream = new StreamReader(context.Request.InputStream))
            {
                requestData = inputStream.ReadToEnd();
            }

            return JsonConvert.DeserializeObject<T>(requestData, new Raven.Imports.Newtonsoft.Json.Converters.StringEnumConverter());           
        }
    }
}
错误:

无法将当前JSON数组(例如[1,2,3])反序列化为类型 “Corina.Web.Views.DocumentViewModel”,因为该类型需要JSON 对象,例如{name:value}以正确反序列化

要修复此错误,请将JSON更改为JSON对象,例如。 {name:value}或将反序列化类型更改为数组或 实现集合接口的类型,例如ICollection、IList 类似于可以从JSON数组反序列化的列表。 还可以将JsonArrayAttribute添加到类型中,以强制它 从JSON数组反序列化


有人能告诉我如何在对象列表而不是对象上进行反序列化吗?

不知道json数据的结构,但我猜您正在使用一些自定义类来使用DataContractJsonSerializer进行反序列化,您可以按以下方式进行反序列化

Json列表:

var testdata = "[{\"name\":\"numToRetrieve\",\"value\":\"3\",\"label\":\"Number of     items       to retrieve:\"},{\"name\":\"showFoo\",\"value\":\"on\",\"label\":\"Show foo?\"},  {\"name\":\"title\",\"value\":\"Foo\",\"label\":\"Foo:\"}]";

DataContractJsonSerializer js = 
new DataContractJsonSerializer(typeof (List<FooDef>));
var stream = new MemoryStream(Encoding.UTF8.GetBytes(testdata));
var foo = js.ReadObject(stream);
stream.Close();



[DataContract]
public sealed class FooDef
{
    [DataMember(Name = "name", IsRequired = true)]
    public string Name { get; set; }

    [DataMember(Name = "value", IsRequired = true)]
    public string Value { get; set; }

    [DataMember(Name = "label", IsRequired = true)]
    public string Label { get; set; }
} 

我不知道json数据的结构,但我猜您正在使用一些自定义类来使用DataContractJsonSerializer进行反序列化,您可以通过以下方式进行反序列化

Json列表:

var testdata = "[{\"name\":\"numToRetrieve\",\"value\":\"3\",\"label\":\"Number of     items       to retrieve:\"},{\"name\":\"showFoo\",\"value\":\"on\",\"label\":\"Show foo?\"},  {\"name\":\"title\",\"value\":\"Foo\",\"label\":\"Foo:\"}]";

DataContractJsonSerializer js = 
new DataContractJsonSerializer(typeof (List<FooDef>));
var stream = new MemoryStream(Encoding.UTF8.GetBytes(testdata));
var foo = js.ReadObject(stream);
stream.Close();



[DataContract]
public sealed class FooDef
{
    [DataMember(Name = "name", IsRequired = true)]
    public string Name { get; set; }

    [DataMember(Name = "value", IsRequired = true)]
    public string Value { get; set; }

    [DataMember(Name = "label", IsRequired = true)]
    public string Label { get; set; }
} 

您必须创建此类并创建如下方法:

   public class Demo
   {
      public string Name;
      public string Type;
      public string Value;
      public string ChildContentType;
      public string ChildMetadata;
   }

    public void Deserialize()
    {
        string jsonObjString = "[{\"Name\": \"Description\",\"Type\": \"Text\",\"Value\": \"XXX\",\"ChildContentType\": \"Value\",\"C??hildMetadata\": \"YYY\"}]";
         var ser = new JavaScriptSerializer();
         var arreyDemoObj = ser.Deserialize<Demo[]>(jsonObjString);

         foreach (Demo objDemo in arreyDemoObj)
         {
             //Do what you want with objDemo
         }
      }

请注意,您需要为添加引用。

您必须创建此类并创建如下方法:

   public class Demo
   {
      public string Name;
      public string Type;
      public string Value;
      public string ChildContentType;
      public string ChildMetadata;
   }

    public void Deserialize()
    {
        string jsonObjString = "[{\"Name\": \"Description\",\"Type\": \"Text\",\"Value\": \"XXX\",\"ChildContentType\": \"Value\",\"C??hildMetadata\": \"YYY\"}]";
         var ser = new JavaScriptSerializer();
         var arreyDemoObj = ser.Deserialize<Demo[]>(jsonObjString);

         foreach (Demo objDemo in arreyDemoObj)
         {
             //Do what you want with objDemo
         }
      }

请注意,您需要为添加引用。

据我所知,您将两个JSON对象发送到一起,就像您将一个附加到另一个一样,并且无法将它们反序列化在一起,并要求您发送一个对象,以太将其转换为列表。您不能使用JavaScriptSerializer吗?嗯,是的,我发送类似:[对象,对象,…] ; 所以不能转换。我会使用它我知道如何使用:@Roland:你能告诉我你的对象的结构吗?对我来说,我的理解是,你将两个JSON对象一起发送,就像你将一个附加到另一个一样,不能将它们反序列化在一起,并要求你发送一个对象,以太将其转换为列表难道你不能使用JavaScriptSerializer吗?嗯,是的,我发送类似:[对象,对象,…];我会使用它,我知道如何使用:@Roland:你能给我你的对象的结构吗?使用System.Runtime.Serialization.Json;DataContractJsonSerializer需要。与使用System.Web.Script.Serialization相比;JavaScriptSerializer.using System.Runtime.Serialization.Json所需;DataContractJsonSerializer需要。与使用System.Web.Script.Serialization相比;JavaScriptSerializer所需。