【问题标题】:Deserializing json to anonymous object in c#在c#中将json反序列化为匿名对象
【发布时间】:2011-07-12 22:27:41
【问题描述】:

如何将一串 json 格式的数据转换成匿名对象?

【问题讨论】:

标签: .net json


【解决方案1】:

C# 4.0 添加了可以使用的动态对象。看看this。

【讨论】:

  • 要找到System.Web.Script.Serialization的dll的名称是什么?
  • System.Web.Extensions.dll 包含 JavaScriptSerializer 类。
【解决方案2】:

使用动态是这样的:

string jsonString = "{\"dateStamp\":\"2010/01/01\", \"Message\": \"hello\" }";
dynamic myObject = JsonConvert.DeserializeObject<dynamic>(jsonString);

DateTime dateStamp = Convert.ToDateTime(myObject.dateStamp);
string Message = myObject.Message;

【讨论】:

    【解决方案3】:

    vb.net 使用 Newtonsoft.Json :

    dim jsonstring = "..."
    dim foo As JObject = JObject.Parse(jsonstring)
    dim value1 As JToken = foo("key")
    
    
    e.g.:
    dim jsonstring = "{"MESSAGE":{"SIZE":"123","TYP":"Text"}}"
    dim foo = JObject.Parse(jsonstring)
    dim messagesize As String = foo("MESSAGE")("SIZE").ToString()
    'now in messagesize is stored 123 as String
    

    所以你不需要一个固定的结构,但你需要知道在那里你能找到什么。

    但是,如果您甚至不知道里面是什么,那么您可以通过导航成员枚举该 JObject,例如.first(), .next() 例如:因此您可以实现经典的深度优先搜索并筛选 JObject

    (用于将 vb.net 转换为 c#:http://converter.telerik.com/)

    【讨论】:

      【解决方案4】:

      使用 Newtonsoft.Json,使用 DeserializeAnonymousType:

      string json = GetJsonString();
      var anonType = new { Order = new Order(), Account = new Account() };
      var anonTypeList = new []{ anonType }.ToList(); //Trick if you have a list of anonType
      var jsonResponse = JsonConvert.DeserializeAnonymousType(json, anonTypeList);
      

      基于我的回答这个答案:https://stackoverflow.com/a/4980689/1440321

      【讨论】:

        【解决方案5】:

        我认为你能得到的最接近的是 .NET 4.0 中的dynamic

        匿名对象不起作用的原因是它们仍然是静态类型的,编译器无法为仅作为字符串存在的类提供智能感知。

        【讨论】:

        • 智能感知不是问题。编译时检查是。
        【解决方案6】:

        由于没有人提到SimpleJSON,我在这里添加它。它是一个小类(低于 50k),您只需要使用其中一个文件(Unity、.NET 或 Binary),这与 NewtonSoft 库(当前为 JSON.NET)相比令人印象深刻。它不需要您在程序中包含整个 C# 编译器,而且速度相对较快(需要进行一些调整以使其更快)。它也有延迟加载,当你只需要读取它的一部分时,它不会解析整个 JSON。

        解析是这样完成的

        JSONNode node = JSON.Parse(str)
        

        访问内容就是这样

        node["key"].AsString
        node["key"].AsInt
        node["key"].AsArray   // To access JSON Array
        node["key"].AsObject  // To access JSON in key as object
        ...
        

        或者你可以像这样继续使用括号

        node["key1"]["key2"]["key3"].AsString
        

        要创建 JSON 字符串,我将使用 StringBuilder 并手动生成 json 字符串,这是有史以来最快的方法。但是如果你愿意,你可以像这样使用 SimpleJson 来完成它

        JSONNode node = new JSONObject();
        node["key"]= "some data";
        node["key1"] = new JSONObject();
        node["key1"]["key2"] = "another data";
        String s = node.ToString();
        

        这将生成如下的json字符串

        {
            "key":"somedata",
            "key1": {
                "key2":"another data"
            }
        }
        

        如果 key 不存在并返回默认值,以前的版本不会抛出异常(在 C# 标准中定义,但当前版本会抛出异常。

        【讨论】:

          猜你喜欢
          • 2011-10-17
          • 1970-01-01
          • 1970-01-01
          • 2023-04-08
          • 2015-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多