首页 文章

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

提问于
浏览 1004
2

我正在开发一个主要以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());           
        }
    }
}

Error

无法将当前JSON数组(例如[1,2,3])反序列化为类型“Corina.Web.Views.DocumentViewModel”,因为该类型需要JSON对象(例如{“name”:“value”})才能正确反序列化 . 要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList),例如List从JSON数组反序列化 . JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化 .

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

2 回答

  • 4

    不知道你的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; }
    }
    
  • 0

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

    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
             }
          }
    

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

相关问题