【问题标题】:deserialize json array list in c#在c#中反序列化json数组列表
【发布时间】:2013-02-13 00:20:05
【问题描述】:

我正在开发一个主要以 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) 比如可以从 JSON 数组反序列化的 List。 JsonArrayAttribute 也可以添加到类型中以强制它 从 JSON 数组反序列化。

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

【问题讨论】:

  • 对我而言,我的理解是您将 2 个 JSON 对象一起发送(就像您将一个附加到另一个)并且不能将它们反序列化并要求您发送一个对象,然后将其转换为列表
  • 不能用 JavaScriptSerializer 吗?
  • 嗯,是的,我发送类似:[ Object, Object, .... ];所以无法转换。
  • 我会用它我知道怎么做:)
  • @Roland:你能告诉我你的对象的结构吗?

标签: c# asp.net json deserialization


【解决方案1】:

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

   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 的引用。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • using System.Runtime.Serialization.Json; 需要 DataContractJsonSerializer。与 JavaScriptSerializer 所需的 using System.Web.Script.Serialization; 相比。
    猜你喜欢
    • 2011-10-19
    • 2013-05-27
    • 2018-09-23
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多