反序列化后如何调用json?

时间:2015-05-29 13:55:03

标签: c# asp.net json

我使用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。我不确定反序列化。

2 个答案:

答案 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());
        }
    }

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

希望这会有点轻松:)