2012-10-30 56 views
0

我试图通过包含一些JSON的隐藏文本字段将一些数据发布到我的MVC 3控制器。我有通过字符串coursesList传入的JSON。任何人都有一个想法,为什么这不起作用?反序列化C#的JSON字符串

我所做的只是将JSON字符串中的字节[]写出来,写入MemoryStream,并反序列化那个流 - 或者试图。 BookCourse bc总是以null属性结束。

这里的东西,如JSON我会使用:

[{"coursesection":"1234","netlogon":"jsmith","label":"CRSE-1313 Generic Course Titling ~ Joe Smith"}] 

而这里的对象被反序列化为:

using System.Runtime.Serialization; 

namespace xxxx.Models 
{ 
    [DataContract] 
    public class BookCourse 
    { 
     [DataMember] 
     public string coursesection { get; set; } 

     [DataMember] 
     public string netlogon { get; set; } 

     [DataMember] 
     public string label { get; set; } 
    } 
} 

最后,控制器动作的代码来做到这一点 -

var byteArray = Encoding.ASCII.GetBytes(coursesList); 

// Deserialize byte array to data type 
var stream = new MemoryStream(); 
stream.Write(byteArray, 0, byteArray.Length); 
var crs = new DataContractJsonSerializer(typeof(BookCourse)); 
stream.Position = 0; 

// Read stream to object 
ad.CourseSectionIDs = new List<int>(); 
try 
{ 
    var bc = (BookCourse) crs.ReadObject(stream); 
    while (bc.coursesection != null) 
    { 
     cs.AssociateCourseBook(bc.netlogon, bc.coursesection, ad.ISBN); 
     bc = (BookCourse)crs.ReadObject(stream); 
    } 
} 
catch (System.Runtime.Serialization.SerializationException e) 
{ 
    // Is this best practice for handling "none"? 
} 
+0

后你发送的JSON的一个样本。 – f0x

+0

您是否已经通过调试器了解了发生了什么? – markpsmith

+0

您是否通过ajax调用发布json对象?如果是这样,只需在动作签名中有一个相应的参数(属性coursesection,netlogon&label)就可以开箱即用。 – nieve

回答

1

您的JSON字符串表示BookCourse的集合,而不是一个BookCourse。因此,调整代码:

var serializer = new DataContractJsonSerializer(typeof(BookCourse[])); 

然后:

var bookCourses = (BookCourse[])crs.ReadObject(stream); 

,或者如果你想用一个单一的BookCourse你需要改变你的JSON字符串,并拆除包装方括号代表收集工作。

+0

非常好。先生,谢谢你。 – NargothBond

1

达林是正确的,如果你想在合同水平上做到这一点,这是变化。

[DataContract] 
public class BookCourse 
{ 
    [DataMember] 
    public string coursesection { get; set; } 

    [DataMember] 
    public string netlogon { get; set; } 

    [DataMember] 
    public string label { get; set; } 
} 

[DataContract] 
public class BookCourceCollection 
{ 
    [DataMember] 
    public List<BookCourse> Collection; 

    public static BookCourceCollection ReturnCollection(string jsonString) 
    { 
     MemoryStream ms; 
     BookCourceCollection collection; 

     using (ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString))) 
     { 
      DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(BookCourceCollection)); 
      collection = ser.ReadObject(ms) as BookCourceCollection; 
     } 

     return collection; 
    } 

} 

用法:

string jsonString = "Your JSON string from the front end"; 

var bookCourceObject = BookCourseCollection.ReturnCollection(jsonString); 
foreach (BookCourse bookCourse in bookCourceObject.Collection) 
{ 
    cs.AssociateCourseBook(bookCourse.netlogon, bookCourse.coursesection, bookCourse.ISBN); 
} 
相关问题