繁体   English   中英

将JSON转换为C#类型

[英]Convert JSON to C# type

我想使用JS这样的未知对象

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

发送到具有contentType'application / json'的MVC中。 该对象没有固定密钥,例如该名称“ abcd 1”将来可能会成为另一个名称。

我有功能测试(对象aa)和问题是,我必须使用什么类型的未知数组的对象或字符串。 谢谢

你之前尝试过这个网站: http//json2csharp.com/

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

以我的个人经验,在代码中使用Json的最有用方法是使用dynamic 基本上,您无需将序列化/反序列化为特定类型,而是将json对象转换为动态对象。

在这种情况下,您将失去编译时验证,但能够支持任何文档结构。

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

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

$.ajax({
  ...
  data: {data: JSON.stringify({first: "name", next: ["a", "b"], last: {o: "in"}})}
})
[HttpPost]
    public JsonResult SaveMenu(String data)
    {
       dynamic JData = JObject.Parse(data);
       //--now JData.first == "name"
       if (JData.last is JObject)
       {

       }

       //--or dynamic foreach
       foreach (dynamic own in JData)
       {
          //--own.Name == first, next and last
          //--access to variable == JData[own.Name]
          if (JData[own.Name] is JArray)
          {
              foreach (String var in JData[own.Name])
              {

              }
          }
       }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM