【问题标题】:How to get some values from a JSON string in C#?如何从 C# 中的 JSON 字符串中获取一些值?
【发布时间】:2013-07-12 14:42:23
【问题描述】:

我有一个字符串,我想从中获取一些值。

我的字符串看起来像:

字符串1:

"{\r\n   \"id\": \"100000280905615\",
 \r\n \"name\": \"Jerard Jones\",
 \r\n   \"first_name\": \"Jerard\",
 \r\n   \"last_name\": \"Jones\",
 \r\n   \"link\": \"https://www.facebook.com/Jerard.Jones\",
 \r\n   \"username\": \"Jerard.Jones\",
 \r\n   \"gender\": \"female\",
 \r\n   \"locale\": \"en_US\"\r\n}"

字符串2:

"{\r\n   \"id\": \"100000390001929\",
  \r\n   \"name\": \"\\u05d1\\u05d2\\u05e8\\u15dc\\u25d9 \\u05d1\\u05e8\\u05d5\\u05e9\",
  \r\n   \"first_name\": \"\\u05d4\\u05d2\\u05e7\\u02dc\\u05d9\",
  \r\n   \"last_name\": \"\\u05d1\\u05e8\\u05d5\\u05e9\",
  \r\n   \"link\": "https://www.facebook.com/people/\\u05d2\\u05d1\\u05e@\\u05dc\\u05d9-\\u05d1\\u05e8\\u05d4\\u05e9/100000390001929\",
  \r\n   \"gender\": \"female\",
  \r\n   \"locale\": \"he_IL\"\r\n}"

不幸的是,有一种情况,一个字符串将由相同的概念,但没有一些参数:

字符串3:

"{\r\n   \"id\": \"100000390001929\",
  \r\n   \"last_name\": \"\\u05d1\\u05e8\\u05d5\\u05e9\",
  \r\n   \"gender\": \"female\",
  \r\n   \"locale\": \"he_IL\"\r\n}"

如何获取以下值:idfirst_namelast_namegenderlocale

任何帮助表示赞赏!

【问题讨论】:

标签: c# json


【解决方案1】:

您的字符串是 JSON 格式的,因此您需要将其 解析 成一个对象。为此,您可以使用JSON.NET

这是一个如何将 JSON 字符串解析为动态对象的示例:

string source = "{\r\n   \"id\": \"100000280905615\", \r\n \"name\": \"Jerard Jones\",  \r\n   \"first_name\": \"Jerard\", \r\n   \"last_name\": \"Jones\", \r\n   \"link\": \"https://www.facebook.com/Jerard.Jones\", \r\n   \"username\": \"Jerard.Jones\", \r\n   \"gender\": \"female\", \r\n   \"locale\": \"en_US\"\r\n}";
dynamic data = JObject.Parse(source);
Console.WriteLine(data.id);
Console.WriteLine(data.first_name);
Console.WriteLine(data.last_name);
Console.WriteLine(data.gender);
Console.WriteLine(data.locale);

编码愉快!

【讨论】:

  • 谢谢..我用的是:动态数据=JsonConvert.DeserializeObject(elements[0].Text);
  • 这一切都很好,但在你有一个动态字符串之前,你需要从 json 中获取。例如用户。{ID}.用户名
  • 编辑:找到了一种使用这种方法的方法:- String username = data["Users"]["" + User]["Username"];
  • 喜欢这里的dynamic 用法! +1
  • 如果我尝试从动态 objetc 返回一个属性(例如结果),返回 null :s
【解决方案2】:

以下代码对我有用。

用途:

using System.IO;
using System.Net;
using Newtonsoft.Json.Linq;

代码:

 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    using (Stream responseStream = response.GetResponseStream())
                    {
                        using (StreamReader responseReader = new StreamReader(responseStream))
                        {
                            string json = responseReader.ReadToEnd();
                            string data = JObject.Parse(json)["id"].ToString();
                        }
                    }
                }

//json = {"kind": "ALL", "id": "1221455", "longUrl": "NewURL"}

【讨论】:

    【解决方案3】:

    我的字符串

    var obj = {"Status":0,"Data":{"guid":"","invitationGuid":"","entityGuid":"387E22AD69-4910-430C-AC16-8044EE4A6B24443545DD"},"Extension":null}
    

    以下代码获取 guid:

    var userObj = JObject.Parse(obj);
    var userGuid = Convert.ToString(userObj["Data"]["guid"]);
    

    【讨论】:

    • 我认为你的字符串不是字符串 ;-)
    【解决方案4】:

    像这样创建一个类:

    public class Data
    {
        public string Id {get; set;}
        public string Name {get; set;}
        public string First_Name {get; set;}
        public string Last_Name {get; set;}
        public string Username {get; set;}
        public string Gender {get; set;}
        public string Locale {get; set;}
    }
    

    (我不是 100% 确定,但如果这不起作用,您将需要使用 [DataContract][DataMember]DataContractJsonSerializer。)

    然后创建JSonSerializer:

    private static readonly XmlObjectSerializer Serializer = new DataContractJsonSerializer(typeof(Data));
    

    并反序列化对象:

    // convert string to stream
    byte[] byteArray = Encoding.UTF8.GetBytes(contents);
    using(var stream = new MemoryStream(byteArray))
    {
        (Data)Serializer.ReadObject(stream);
    }
    

    【讨论】:

    • Json.NET 远胜于 DataContractJsonSerializer。见功能对照表:json.codeplex.com
    • 而且ServiceStack.Text比JSON.Net好很多。
    • 我喜欢 Json.NET 但这是一个很好的答案,不会引入很多外部代码并且易于理解。
    【解决方案5】:

    使用 System.Text.Json 的 .NET 6 版本

    using System;
                        
    public class Program
    {
        public static void Main()
        {
            var jsonString = @"{ ""id"" : 123 }";
            
            //parse it
            var yourObject = System.Text.Json.JsonDocument.Parse(jsonString);
            //retrieve the value
            var id= yourObject.RootElement
                              .GetProperty("id");
            
            Console.WriteLine(id);
        }
    }
    

    【讨论】:

    • 这应该是最佳答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多