2

我想像这样使用来自 JS 的 uknown 对象

{"aa":{"abcd 1":{"uio":[],"uio2":[],"uio3":["opee1","opee2","opee3"]},"abcd 2":空,“abcd 3”:空,“abcd 4”:空}}

使用 contentType 'application/json' 发送到 MVC。这个对象没有永久键,比如这个名字“abcd 1”将来可以是另一个名字。

我有函数 Test(Object aa) ,问题是,我必须为未知的对象或字符串数​​组使用什么类型。谢谢

4

4 回答 4

3

你以前试过这个网站吗:http: //json2csharp.com/

于 2013-09-19T09:09:18.700 回答
2

尽管在 JSON 到 C# 解析/序列化中内置的 ASP.NET 4.0 工作得很好,并且在大多数情况下,您只需定义一个简单的 C# 类来模拟 JSON 的“签名”,并通过调用来获取 JSON 的正确 C# 表示形式像 Test(MyCSharpJsonObj aa) 之类的东西,你似乎需要更强大的东西。请注意您将在下面看到的代码,不要认为您可以像这样重载您的函数Test(ListData1 aa), Test(ListData2 aa),如果使用 Web,ASP.NET 不会根据客户端的请求为您正确调用正确的函数,甚至可能无法正确编译API,不确定。

您更有可能必须从与请求中发送的 JSON 密切相关的客户端调用正确的函数,如下所示:Test1(ListData1 aa), Test2(ListData2 aa)使用如下代码来帮助您:

[Serializable]
        [DataContract]
        public class ListData1
        {
            [DataMember]
            public string r0 { get; set; }
            [DataMember]
            public string r1 { get; set; }
            [DataMember]
            public string r2 { get; set; }
            [DataMember]
            public List<Data1> optdata { get; set; }

            public ListData1() { }

            public string ToJson()
            {
                return JSONHelper.Serialize<ListData1>(this);
            }
        }

   [Serializable]
        [DataContract]
        public class Data1
        {
            [DataMember]
            public string label { get; set; }
            [DataMember]
            public string d0 { get; set; }
            [DataMember]
            public string d1 { get; set; }

            public Data1() { }

            public string ToJSON()
            {
                return JSONHelper.Serialize<Data1>(this);
            }
        }
        [Serializable]
        [DataContract]
        public class ListData2
        {
            [DataMember]
            public string r0 { get; set; }
            [DataMember]
            public string r1 { get; set; }
            [DataMember]
            public string r2 { get; set; }
            [DataMember]
            public List<Data2> optdata { get; set; }

            public ListData2() { }

            public string ToJson()
            {
                return JSONHelper.Serialize<ListData2>(this);
            }
        }

 [Serializable]
        [DataContract]
        public class Data2
        {
            [DataMember]
            public string label { get; set; }
            [DataMember]
            public string d0 { get; set; }
            [DataMember]
            public string d1 { get; set; }
            [DataMember]
            public string d2 { get; set; }

            public Data2() { }

            public string ToJSON()
            {
                return JSONHelper.Serialize<Data2>(this);
            }
        }

 public static class JSONHelper
    {
        public static string Serialize<T>(T obj)
        {
            System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
            MemoryStream ms = new MemoryStream();
            serializer.WriteObject(ms, obj);
            string retVal = Encoding.UTF8.GetString(ms.ToArray());
            return retVal;
        }

        public static T Deserialize<T>(string json)
        {
            if (string.IsNullOrEmpty(json))
            {
                return default(T);
            }
            T obj = Activator.CreateInstance<T>();
            MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
            System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
            obj = (T)serializer.ReadObject(ms);
            ms.Close();
            return obj;
        }
    }
于 2013-09-19T06:56:54.570 回答
1

就我个人的经验而言,在代码中使用 Json 最有用的方法是使用dynamics. 基本上,不是将 json 对象序列化/反序列化为特定类型,而是将其转换为动态对象。

在这种情况下,您可以放松编译时验证,但可以支持任何文档结构。

在 MVC4 中,您可以使用内置Json.Decode()方法,System.Web.Helpers.dll从中返回动态对象。否则,有很多用于该特定目的的库,例如 Json.Net

于 2013-09-19T09:30:17.483 回答
1

最后我找到了解决方案。使用 Newtonsoft.Json 和此代码作为动态数据结构的示例:

$.ajax({
  ...
  数据:{数据:JSON.stringify({first:“name”,下一个:[“a”,“b”],last:{o:“in”}})}
})
    [HttpPost]
    公共 JsonResult SaveMenu(字符串数据)
    {
       动态 JData = JObject.Parse(data);
       //-- 现在 JData.first == "name"
       如果(JData.last 是 JObject)
       {

       }

       //--或动态foreach
       foreach(在 JData 中动态拥有)
       {
          //--own.Name == first, next and last
          //-- 访问变量 == JData[own.Name]
          if (JData[own.Name] 是 JArray)
          {
              foreach(JData[own.Name] 中的字符串 var)
              {

              }
          }
       }
    }

于 2013-09-20T10:37:25.010 回答