代码之家  ›  专栏  ›  技术社区  ›  user469652

有没有办法将JSON对象列表从JS传递到C#?

  •  2
  • user469652  · 技术社区  · 14 年前

    我有点困惑。 Javascript将生成以下JSON数据。

    {type:"book"     , author: "Lian", Publisher: "ABC"}
    {type:"Newspaper", author: "Noke"}
    

    这只是一个例子,事实上我得到的不止这些。

    因为我在不同的JSON数据之间有公共字段,所以我不知道是否可以一次将其传递给C。 我想做的是把这个传给c,然后做一些处理,什么是最好的方法?我正在使用ASP.NET MVC2。

    谢谢你的回答或提示。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Matt    14 年前

    上面两个JSON语句的组合在一起是无效的JSON。也就是说,您将无法使用JavaScriptSerializer类直接将数据反序列化为c结构。相反,您将必须首先执行一些手动解析,以将其分解为有效的JSON,或者完全执行手动解析。

    实际上,我建议通过有效的JSON发送。你可以这样做:

    {list: [
        {type:"book"     , author: "Lian", Publisher: "ABC"},
        {type:"Newspaper", author: "Noke"} ]
    

    很难说清楚,因为只有你知道用例的细节。您可以使用传统的“ajax”请求发送这些数据。这是很容易做到的任何一个JS库,但我建议只是去与一个无论如何-他们提供更高层次的结构,更容易使用(和地址跨浏览器的特质)。

    由于您使用的是ASP.NET MVC2,我建议您使用jQuery。微软现在支持jQuery作为他们选择的JS库,甚至将其作为新web项目的默认库。

    一旦将上述JSON传递给C#,就可以通过执行以下操作来反序列化它:

    JavaScriptSerializer serializer = new JavaScriptSerializer();
    var result = serialzer.Deserialize<Dictionary<string, object>>(postedJSONData);
    

    你的结果将有一个这样的结构,用C#:

    Dictionary<string, object> result =>
        { "list" => object },
                    object => List<object>,
                              List<object> => Dictionary<string, object>
                                              { "type" => "book", "author" => "Lian" } // etc
    
        2
  •  2
  •   BGerrissen    14 年前
    [
        {type:"book"     , author: "Lian", Publisher: "ABC"},
        {type:"Newspaper", author: "Noke"}
    ]
    

    仍然是有效的JSON(实际上键也需要包含在“well”中),因此您可以 .push() 每次创建JSON记录时,都会将其放入一个数组中。

    var list = [];
    // code doing other stuff
    list.push({type:"book"     , author: "Lian", Publisher: "ABC"});
    // more code doing other stuff
    list.push({type:"Newspaper", author: "Noke"})
    

    一旦构建了JSON列表,就可以一次性将该列表发送到后端。

        3
  •  0
  •   Seattle Leonard    14 年前

    您还可以使用JavaScriptSerializer来反序列化您自己的自定义类型。本质上,您使用json对象的所有属性创建一个非常简单的类型,然后调用

    JavaScriptSerializer serializer = new JavaScriptSerializer();
    MyType result = serialzer.Deserialize<MyType>(JsonData);
    

    也可以反序列化数组

    MyType[] result = serialzer.Deserialize<MyType[]>(JsonData);