【问题标题】:Convert JSON to C# type将 JSON 转换为 C# 类型
【发布时间】:2013-09-19 06:38:55
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c# asp.net asp.net-mvc-4


【解决方案1】:

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

【讨论】:

  • 完全错了。键可以更改自己的名称,因此我不能使用基本的 c# 类。
  • 我希望对 cme​​ts 投反对票,天哪,这真是粗鲁的 user1173536,如果你不是在找人为你做这件事,自定义我的代码就是你问题的答案
【解决方案2】:

虽然 ASP.NET 4.0 内置 JSON 到 C# 的解析/序列化工作得很好,但在大多数情况下,您可以定义一个简单的 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 的动态结构吗?就像将 application/json 传递给任何其他类型,如 JObject 或动态类型?我尝试将接受更改为 application/json 并添加到函数(动态数据)。存在任何结构,我可以动态访问这样的变量吗?非常简单的例子:动态数据;对象 aa = data.aa;字符串 abcd2 = aa["abcd 2"];
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    终于找到了解决办法。使用 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) { } } } }

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多