如何在反序列化后调用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。

如何在反序列化后调用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());
        }
    }

这两个都是静态方法,因为它们包含在我创建的类库中,以保存代码重复。

希望这能让你更明白一点:)