使用.Net反序列化Json

本文关键字:Json 反序列化 Net 使用 | 更新日期: 2023-09-27 18:24:49

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

{"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中返回的对象计数为零。知道这个JSON如何在.Net中反序列化吗(即不使用JSON.Net或任何类似的第三方dll)?

使用.Net反序列化Json

这里有一个选项。

//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"]
    });             
}

从理论上讲,根对象应该类似于这个

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