使用 .Net NewtonSoft 从 json 响应中提取 key:values 数据
Extracting key:values data from json response using .Net NewtonSoft
我有一个 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);
};
干杯!
序列化是将对象转换为可以存储、在系统之间传递并在需要时转换回对象的形式的过程。形式可以是二进制数据或 text/string(例如,您拥有的音频文件对象的字符串表示形式)。在 MSDN and Wikipedia 中阅读有关序列化的信息。
反序列化是从序列化的 binary/string 数据中带回对象的逆过程。在此处了解 .Net JSON Serialization and JSON Deserialization with Newtonsoft Json。当您执行 JsonConvert.DeserializeObject
.
时,您已经在使用它了
现在要反序列化您拥有的数据,您需要 class 与数据匹配的表示。如果您已经拥有它,那么很好,否则您需要创建它。
您也可以反序列化为 Dictionary<string, dynamic>
并使用键查找值,但是,这是有风险的,因为您不会进行任何编译时类型检查,如果代码或数据有问题,它将抛出 运行时间异常。
让我给你看一些代码示例。
要json反序列化的代码
你需要的 classes
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;
同样,编译器不会在编译时检查动态。如果有任何问题,它将在 运行 时抛出异常失败。
你实际上已经反序列化了,并且有了你需要的一切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
这可以满足您的需求,而无需处理多个额外的反序列化调用和动态处理。您还可以获得关于值的数据类型的信息。
我有一个 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);
};
干杯!
序列化是将对象转换为可以存储、在系统之间传递并在需要时转换回对象的形式的过程。形式可以是二进制数据或 text/string(例如,您拥有的音频文件对象的字符串表示形式)。在 MSDN and Wikipedia 中阅读有关序列化的信息。
反序列化是从序列化的 binary/string 数据中带回对象的逆过程。在此处了解 .Net JSON Serialization and JSON Deserialization with Newtonsoft Json。当您执行 JsonConvert.DeserializeObject
.
现在要反序列化您拥有的数据,您需要 class 与数据匹配的表示。如果您已经拥有它,那么很好,否则您需要创建它。
您也可以反序列化为 Dictionary<string, dynamic>
并使用键查找值,但是,这是有风险的,因为您不会进行任何编译时类型检查,如果代码或数据有问题,它将抛出 运行时间异常。
让我给你看一些代码示例。
要json反序列化的代码
你需要的 classes
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;
同样,编译器不会在编译时检查动态。如果有任何问题,它将在 运行 时抛出异常失败。
你实际上已经反序列化了,并且有了你需要的一切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
这可以满足您的需求,而无需处理多个额外的反序列化调用和动态处理。您还可以获得关于值的数据类型的信息。