如何在反序列化后调用json
本文关键字:调用 json 反序列化 | 更新日期: 2023-09-27 17:51:15
我使用downloadstring()函数导入Json数据。然后我对它进行反序列化(将在下面显示),但我不确定之后的数据会发生什么。我不知道如何称呼它或如何操纵它,更不用说找到它了。我是Json的新手,这显然是一个非常简单的问题,但是我不明白。
代码
var data = c.DownloadString("http:...");
dynamic jsdonData = JsonConvert.DeserializeObject<dynamic>(data);
Console.WriteLine(jsonData);?????????????????
Json数据看起来与此类似。
"$id":"1",
"$values":[
{
"$id":"2",
"ID":....,
"MSSCompanyID":....,
"CircuitID":"....",
"CompanyName":"...",
"Metrics":{
"$id":"3",
"$values":[
{
"$id":"4",
"longId":1164568,
"unit":"......",
"name":"...."
},
{
"$id":"5",
"longId":1164757,
"unit":".....",
"name":"......"
}
]
}
},
{
"$id":"6",
"ID":....,
"MSSCompanyID":......,
"CircuitID":"......",
"CompanyName":"....",
"Metrics":{
"$id":"7",
"$values":[
{
"$id":"8",
"longId":...,
"unit":".......",
"name":"......."
},
{
"$id":"9",
"longId":1164757,
"unit":"......",
"name":".........."
}
]
}
},
Json是有效的,downloadstring确实像它应该拉Json。
另一个答案是使用NuGet抓取JSON.NET。
创建一个可以表示JSON对象的POCO类:
public class CompanyDetails
{
public int ID { get; set; }
public int MSSCompanyID { get; set; }
public int CircuitID { get; set; }
public string CompanyName { get; set; }
public Metric[] Metrics { get; set; }
}
public class Metric
{
public int LongId { get; set; }
public string Unit { get; set; }
public string Name { get; set; }
}
提示:如果你不关心某个对象不被反序列化,你可以将该属性的类型设置为ExpandoObject
,这意味着c#将负责"创建"必要的动态类结构。ExpandoObject
基本上就是dynamic
。
使用JSON.NET
库中的JsonConvert
,您可以像这样反序列化它:
public CompanyDetails[] GetDetails(string json)
{
// this adds automatic camel casing conversions
JsonConvert.DefaultSettings = () => new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
return JsonConvert.DeserializeObject<CompanyDetails[]>(json);
}
现在,你将把你的JSON
反序列化成一个可爱的c#对象图。你现在可以遍历它,直到你满意为止。如果您愿意,甚至可以插入复合模式或访问者模式。
请记住:我使用CompanyDetails[]
,也可以是ICollection<>
, Collection<>
, IEnumerable<>
或List<>
等。
我个人是这样反序列化Json字符串的:
public static T DeSerializeJSon<T>(string JSON)
{
using (MemoryStream stream = new MemoryStream())
{
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(T));
var bytes = Encoding.UTF8.GetBytes(JSON);
stream.Write(bytes, 0, bytes.Length);
stream.Position = 0;
T jsonobject = (T)ds.ReadObject(stream);
return jsonobject;
}
}
可以看到,一旦反序列化,操作这个字符串就更容易了,因为它将包含在一个对象中。
作为参考,下面是我如何序列化的:
public static string SerializeJSon<T>(T objectData)
{
using (MemoryStream stream = new MemoryStream())
{
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(T));
ds.WriteObject(stream, objectData);
return Encoding.UTF8.GetString(stream.ToArray());
}
}
这两个都是静态方法,因为它们包含在我创建的类库中,以保存代码重复。
希望这能让你更明白一点:)