【问题标题】:Deserializing Json using .Net使用 .Net 反序列化 Json
【发布时间】:2012-02-16 20:51:21
【问题描述】:

我有一个以这种格式返回 JSON 的外部供应商 API

{"3":{"id":1,"name":"Scott Foo","age":55},
"59":{"id":2,"name":"Jim Morris","age":62}}

我正在尝试使用以下代码对其进行反序列化

[DataContract]
public class Name
{
    [DataMember]
    public int id { get; set; }

    [DataMember]
    public string name { get; set; }

    [DataMember]
    public int age{ get; set; }
}

要反序列化的代码是

List<Name> nameList = Deserialize<List<Name>>(temp); 

反序列化定义为

public static T Deserialize<T>(string json)
{
    T obj = Activator.CreateInstance<T>();
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    obj = (T)serializer.ReadObject(ms);
    ms.Close();
    ms.Dispose();
    return obj;
}

nameList 中返回的对象计数为零。知道如何在 .Net 中反序列化此 JSON(即不使用 Json.Net 或任何此类第三方 dll)吗?

【问题讨论】:

  • 你想要的 id、name 和 age 属性前面的“3”和“59”是怎么回事?
  • 更可能是Deserialize&lt;Dictionary&lt;string, Name&gt;&gt; - 因为这不是一个列表/JSON 数组,它是一个 JSON 对象,具有两个名为“3”和“59”的属性。
  • “3”和“59”是我认为从第三方返回的某种行 ID

标签: c# .net json deserialization


【解决方案1】:

这是一种选择。

//using System.Runtime.Serialization.Json;

public static dynamic Deserialize(string content)
{
    return new System.Web.Script.Serialization.JavaScriptSerializer().DeserializeObject(content);
}

var f = Deserialize(json);
List<Name> list = new List<Name>();

foreach(var item1 in (Dictionary<string, object>) f)
{
    Dictionary<string, object> item2 = (Dictionary<string, object>) item1.Value;

    list.Add( new Name(){
        id = (int) item2["id"],
        name = (string) item2["name"],
        age = (int) item2["age"]
    });             

}

【讨论】:

    【解决方案2】:

    理论上你的根对象应该是这样的

    public class root
    {
        public Name 3;
        public Name 59;
    }
    

    359 不是有效的 c# 变量/字段/属性名称(它们也是动态的)。因此,您不能将其反序列化为类。

    我看到您不想使用 Json.Net 或任何此类第三方 dll,但这是我使用 Json.Net 解析它的方式

    string json = @"{""3"":{""id"":1,""name"":""Scott Foo"",""age"":55},""59"":{""id"":2,""name"":""Jim Morris"",""age"":62}}";
    
    JObject jobj = (JObject)JsonConvert.DeserializeObject(json);
    
    foreach (JProperty user in jobj.Children())
    {
        Console.WriteLine(user.Name + "==>" + user.Value["name"]);
    }
    

    和输出

    3==>Scott Foo
    59==>Jim Morris
    

    【讨论】:

      猜你喜欢
      • 2020-06-30
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多