0

JSON を含む非表示のテキスト フィールドを介して、MVC 3 コントローラーにデータを投稿しようとしています。その JSON を文字列 courseList 経由で渡しました。なぜこれが機能しないのか誰にも分かりますか?

私がやっているのは、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"?
}
4

2 に答える 2

1

Darin は正しいです。契約レベルで変更を行う場合は、次のように変更します。

[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);
}
于 2012-10-30T13:03:24.240 に答える
1

JSON 文字列は、単一の BookCourse ではなく、BookCourse のコレクションを表します。したがって、コードを調整します。

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

その後:

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

または、単一の BookCourse で作業したい場合は、JSON 文字列を変更し、コレクションを表す角括弧を削除する必要があります。

于 2012-10-30T12:57:38.923 に答える