2013-02-27 77 views
2

我正在研究一個以後端爲主的C#項目,但我並不是一個有經驗的C#開發人員,所以我無法弄清楚熱解決一個列表的json反序列化的物體。下面的函數是什麼需要反序列化的照顧,但我得到一個錯誤:反序列化json數組列表中的c#

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對象(例如 {「名稱」:「值」})或改變反序列化類型到一個數組或一個實現的集合接口 類型(例如ICollection的, IList) 就像可以從JSON數組反序列化的List。 也可以將JsonArrayAttribute添加到該類型,以強制它從一個JSON數組中反序列化 。

誰能告訴我如何在對象列表而不是對象上進行反序列化?

+0

對我來說,我的理解是,你一起發送了2個JSON對象(就像你將這個對象附加到另一個對象上)並且不能將它們反序列化,並要求你發送一個對象,然後將它轉換爲List <> – Aristos 2013-02-27 09:19:16

+0

Can你用JavaScriptSerializer嗎? – Popeye 2013-02-27 09:22:06

+0

嗯,是的,我發了這樣的東西:'[Object,Object,....]';所以不能轉換。 – Roland 2013-02-27 09:22:07

回答

4

你有創建此類並創建如下方法:

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添加引用。

0

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

'使用System.Runtime.Serialization.Json ;'DataContractJsonSerializer'需要。與'JavaScriptSerializer'所需的'使用System.Web.Script.Serialization'相比。 – Matt 2017-07-20 00:47:10