【问题标题】:Extracting key:values data from json response using .Net NewtonSoft使用.Net NewtonSoft从json响应中提取key:values数据
【发布时间】:2015-09-12 20:50:28
【问题描述】:

我有一个想要解析的小 json 文件:

{
    "audio_file": {
        "__type": "File",
        "name": "somename.m4a",
        "url": "the_url"
    },
    "createdAt": "2015-07-30T19:37:14.916Z",
    "location": "Somewhere",
    "objectId": "CSHgwDuhg8",
    "updatedAt": "2015-07-30T19:37:14.916Z"
}

我想要一种根据键访问此处所有值的方法。但由于某种原因,我无法做到..!

我正在尝试以下方法:

var json = JObject.Parse(rawJson);  
string sjson = json.ToString();

JsonTextReader reader = new JsonTextReader(new StringReader(sjson));
while (reader.Read())
{
    if (reader.Value != null)
        Console.WriteLine("Token: {0}, Value: {1}", reader.TokenType, reader.Value);
    else
        Console.WriteLine("Token: {0}", reader.TokenType);
};

干杯!

【问题讨论】:

  • 你有要反序列化的类吗?
  • 你这是什么意思?不确定我是否理解反序列化的概念:)
  • 所以我这样做了: var jsonResult = JsonConvert.DeserializeObject>(sjson);我得到了 5 个键和它们的值,但是我怎样才能访问它们中的一个呢?例如,网址?
  • 嗯.....好吧,让我们写答案。给我 5 分钟。

标签: .net json parsing json.net deserialization


【解决方案1】:

序列化是将对象转换为可以存储、在系统之间传递并在需要时转换回对象的形式的过程。表单可以是二进制数据或文本/字符串(例如,您拥有的音频文件对象的字符串表示形式)。在MSDNWikipedia 中阅读有关序列化的信息。

反序列化是从序列化的二进制/字符串数据中恢复对象的逆过程。在此处了解.Net JSON SerializationJSON Deserialization with Newtonsoft Json。当你做JsonConvert.DeserializeObject时,你已经在使用它了。

现在要反序列化您拥有的数据,您需要与数据匹配的类表示。如果你已经拥有它,那么很好,否则你需要创建它。

您也可以反序列化为Dictionary<string, dynamic> 并使用键查找值,但是,这是有风险的,因为您不会进行任何编译时类型检查,如果代码或数据有问题,则会引发运行时异常。

让我给你看一些代码示例。

json 反序列化代码

你需要的课程

public class AudioFileDetails
{
    public DateTime CreatedAt { get; set;}
    public string Location { get; set; }
    public string Objectid { get; set; }
    public DateTime UpdatedAt { get; set; }
    public FileDetails Audio_File { get; set; }
}

public class FileDetails
{
    public string __Type { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
}

使用 Newtonsoft.Json 反序列化的方法

using Newtonsoft.Json.JsonConvert; //Add Json.NET NuGet package

public class JsonSerializer 
{
    public static T DeserializeData<T>(string jsonData)
    {
        try
        {
            return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(jsonData);
        }
        catch(Exception ex)
        {
            //log exception if required
            return default(T);
        }
    } 
}

现在只需几行代码即可反序列化您的数据并使用内部值

var jsonString = @"{'audio_file':{'__type':'File','name':'somename.m4a','url':'the_url'},'createdAt':'2015-07-30T19:37:14.916Z','location':'Somewhere','objectId':'CSHgwDuhg8','updatedAt':'2015-07-30T19:37:14.916Z'}";
var data = JsonSerializer.DeserializeData<AudioFileDetails>(jsonString);
var url = data.Audio_File.Url; //access any property here

反序列化为字符串、动态字典的代码

var jsonString = @"{'audio_file':{'__type':'File','name':'somename.m4a','url':'the_url'},'createdAt':'2015-07-30T19:37:14.916Z','location':'Somewhere','objectId':'CSHgwDuhg8','updatedAt':'2015-07-30T19:37:14.916Z'}";
var dictionary = JsonSerializer.DeserializeData<Dictionary<string, dynamic>>(jsonString);
//To use, get property with the key. For complex objects, use .PropertyName
var url = dictionary["audio_file"].url; 

同样,编译器不会在编译时检查动态。如果有任何问题,它将在运行时失败并抛出异常。

【讨论】:

  • @PavelZagalsky 修复了几个错别字,请使用此更新后的代码。此外,我还添加了关于如何使用(但不推荐) Dictionary. 的说明
  • 哈!杰出的!非常感谢!
【解决方案2】:

你实际上已经反序列化并拥有你需要的一切,这行var json = JObject.Parse(rawJson);

这是一个你可以调用的方法来获取你想要的所有数据。

    static void OutputJObject(JObject jsonObject, string indent = "")
    {
        foreach (KeyValuePair<string, JToken> node in jsonObject)
        {
            Console.Write(indent);
            if (node.Value.Type == JTokenType.Object)
            {
                Console.WriteLine("Key: {0}", node.Key);
                OutputJObject((JObject)node.Value, indent + "  ");
            }
            else
            {
                Console.WriteLine("Key: {0}, Value: {1}, Type: {2}", node.Key, node.Value, node.Value.Type);
            }
        }          
    }

拨打OutputJObject(json);,你会得到以下输出。

Key: audio_file
  Key: __type, Value: File, Type: String
  Key: name, Value: somename.m4a, Type: String
  Key: url, Value: the_url, Type: String
Key: createdAt, Value: 7/30/2015 19:37:14, Type: Date
Key: location, Value: Somewhere, Type: String
Key: objectId, Value: CSHgwDuhg8, Type: String
Key: updatedAt, Value: 7/30/2015 19:37:14, Type: Date

这为您提供了您想要的东西,而无需处理多个额外的反序列化调用和动态处理。您还可以获得有关值的数据类型的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2015-04-15
    相关资源
    最近更新 更多