【问题标题】:Convert JSON String to JSON Object c#将 JSON 字符串转换为 JSON 对象 c#
【发布时间】:2014-04-04 18:41:18
【问题描述】:

我有这个字符串存储在我的数据库中:

str = "{ "context_name": { "lower_bound": "value", "upper_bound": "value", "values": [ "value1", "valueN" ] } }"

这个字符串已经是 JSON 格式,但我想把它转换成 JObject 或 JSON Object。

JObject json = new JObject();

我尝试了json = (JObject)str; 演员,但它不起作用,我该怎么做?

【问题讨论】:

    标签: c# asp.net json string parsing


    【解决方案1】:

    JObject 为此定义了方法Parse

    JObject json = JObject.Parse(str);
    

    您可能想参考 Json.NET documentation

    【讨论】:

    • 这将转换为 {string},将在您的字符串中添加额外的大括号。
    【解决方案2】:

    如果您不想要或不需要类型化对象,请尝试:

    using Newtonsoft.Json;
    // ...   
    dynamic json  = JsonConvert.DeserializeObject(str);
    

    或者尝试一个类型化的对象试试:

    Foo json  = JsonConvert.DeserializeObject<Foo>(str)
    

    【讨论】:

    • 如果传入的 json 字符串包含一个集合,这也适用于 T 列表: List json = JsonConvert.DeserializeObject>(str)
    【解决方案3】:

    这行得通

        string str = "{ 'context_name': { 'lower_bound': 'value', 'pper_bound': 'value', 'values': [ 'value1', 'valueN' ] } }";
        JavaScriptSerializer j = new JavaScriptSerializer();
        object a = j.Deserialize(str, typeof(object));
    

    【讨论】:

    • 'JavaScriptSerializer' 的命名空间:System.Web.Script.Serialization;
    • 绝对为我工作。在将双引号替换为单引号后使用 JObject 就可以了。谢谢!!!
    • System.Web.Script.Serialization 仅在 .Net 完整框架中可用。
    【解决方案4】:

    你可以尝试如下:

    string output = JsonConvert.SerializeObject(jsonStr);
    

    【讨论】:

      【解决方案5】:

      有一种有趣的方法可以实现另一个目标,即拥有一个基于 json 的强类型类,并使用我几天前第一次使用的非常强大的工具将 tradedoubler json 结果转换为类

      是一个简单的工具:复制您的 json 源代码并在几秒钟内粘贴 you will have a strongly typed class json oriented 。 通过这种方式,您将使用这些更强大且易于使用的类。

      【解决方案6】:

      这适用于我使用JsonConvert

      var result = JsonConvert.DeserializeObject<Class>(responseString);
      

      【讨论】:

        【解决方案7】:

        如果您的 JSon 字符串有 "" 双引号而不是单引号 ' 并且有 \n 作为下一行的指示符,那么您需要将其删除,因为这不是正确的 JSon 字符串,示例如下所示:

                    SomeClass dna = new SomeClass ();
                    string response = wc.DownloadString(url);
                    string strRemSlash = response.Replace("\"", "\'");
                    string strRemNline = strRemSlash.Replace("\n", " ");
                    // Time to desrialize it to convert it into an object class.
                    dna = JsonConvert.DeserializeObject<SomeClass>(@strRemNline);
        

        【讨论】:

          【解决方案8】:

          这在 JObject 的情况下不起作用,这适用于简单的 json 格式数据。我已尝试将我的以下 json 格式数据的数据反序列化为类型,但没有得到响应。

          对于这个 Json

          {
            "Customer": {
              "id": "Shell",
              "Installations": [
                {
                  "id": "Shell.Bangalore",
                  "Stations": [
                    {
                      "id": "Shell.Bangalore.BTM",
                      "Pumps": [
                        {
                          "id": "Shell.Bangalore.BTM.pump1"
                        },
                        {
                          "id": "Shell.Bangalore.BTM.pump2"
                        },
                        {
                          "id": "Shell.Bangalore.BTM.pump3"
                        }
                      ]
                    },
                    {
                      "id": "Shell.Bangalore.Madiwala",
                      "Pumps": [
                        {
                          "id": "Shell.Bangalore.Madiwala.pump4"
                        },
                        {
                          "id": "Shell.Bangalore.Madiwala.pump5"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          }
          

          【讨论】:

            【解决方案9】:

            在您从 api 中检索某个实体的对象列表的情况下,您的响应字符串可能如下所示:

            [{"id":1,"nome":"eeee","username":null,"email":null},{"id":2,"nome":"eeee","username":null,"email":null},{"id":3,"nome":"Ricardo","username":null,"email":null}]
            

            在这种情况下,您可能需要一个 Jason 对象数组并循环访问它们以填充您的 c# 变量。我已经这样做了:

            var httpResponse = await Http.GetAsync($"api/{entidadeSelecionada}");
                List<List<string[]>> Valores = new();
                if (httpResponse.IsSuccessStatusCode)
                {
                    //totalPagesQuantity = int.Parse(httpResponse.Headers.GetValues("pagesQuantity").FirstOrDefault());
                    //Aqui tenho que colocar um try para o caso de ser retornado um objecto vazio
                    var responseString = await httpResponse.Content.ReadAsStringAsync();
            
                    JArray array = JArray.Parse(responseString);
            
                    foreach (JObject objx in array.Children<JObject>())
                    {
                        List<string[]> ls = new();
                        foreach (JProperty singleProp in objx.Properties())
                        {
                            if (!singleProp.Name.Contains("_xyz"))
                            {
                                string[] val = new string[2];
                                val[0] = singleProp.Name;
                                val[1] = singleProp.Value.ToString();
                                ls.Add(val);
                            }
                        }
                        Valores.Add(ls);
                    }
                }
                return Valores;
            

            我通过@Andrei 的回答实现了这个解决方案。

            【讨论】:

              【解决方案10】:
              string result = await resp.Content.ReadAsStringAsync();
                          List<ListView11> _Resp = JsonConvert.DeserializeObject<List<ListView11>>(result);
                          //List<ListView11> _objList = new List<ListView11>((IEnumerable<ListView11>)_Resp);
              
                          IList usll = _Resp.Select(a => a.lttsdata).ToList();
                          // List<ListViewClass> _objList = new List<ListViewClass>((IEnumerable<ListViewClass>)_Resp);
                          //IList usll = _objList.OrderBy(a=> a.ReqID).ToList();
                          Lv.ItemsSource = usll;
              

              【讨论】:

                猜你喜欢
                • 2022-01-01
                • 1970-01-01
                • 2019-08-27
                • 2020-05-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-08-28
                相关资源
                最近更新 更多