我使用downloadstring()函数将我的Json数据带入。然后我反序列化它(将在下面显示),但我不确定之后数据会发生什么。我不知道如何调用它或如何操作它,更不用说找到它了。我是Json的新手,这显然是一个非常简单的问题,但我无法弄清楚。
这是代码
var data = c.DownloadString("http:...");
dynamic jsdonData = JsonConvert.DeserializeObject<dynamic>(data);
Console.WriteLine(jsonData);?????????????????
Json Data与此类似。
"$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是有效的,下载字符串会像它应该的那样拉json。我不确定反序列化。
答案 0 :(得分:1)
另一个答案是使用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#将负责&#34;创建&#34;必要的动态类结构。 ExpandoObject
基本上是dynamic
。
使用JsonConvert
库中的JSON.NET
,您可以按照以下方式对其进行反序列化:
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<>
等等。
答案 1 :(得分:0)
以下是我如何反序列化类似于你的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());
}
}
这些都是静态方法,因为它们包含在我为保存代码重复而创建的类库中。
希望这会有点轻松:)