使用Javascriptserializer反序列化为自定义类型

本文关键字:自定义 类型 反序列化 Javascriptserializer 使用 | 更新日期: 2023-09-27 18:18:42

我正在使用JavaScriptSerializer将json反序列化到我制作的类中,但我有一个问题。

我要序列化的json是这种形式。json的格式不在我的控制范围内。

      {"list": {
        "p1": {
          "a": 6,
          "b": 7
        },
        "p2": {
          "a": 1,
          "b": 1
        }
       }

我想把它反序列化成这样的类;

public class jsonObject 
{
    public listType list {get;set;}
    internal class listType 
    { 
    }
}

和我的反序列化方法;

var engine = new JavaScriptSerializer();
dynamic foo = engine.Deserialize<jsonObject>(json);
我不知道该怎么处理列表里的项目。它不是一个数组,它里面的对象数量可以变化。有时是p1,有时是p7。除了在listType中声明p1,p2,p3,p4,p5,p6,p7之外,还有其他解决方案吗?

使用Javascriptserializer反序列化为自定义类型

您的JSON字符串似乎不正确。试着这样写:

{"list": [
    "p1": {
      "a": 6,
      "b": 7
    },
    "p2": {
      "a": 1,
      "b": 1
    }]
}

我为列表添加了一个左括号,以便将其标记为对象,并将数组的左括号更改为方括号。

try this

var foo = engine.Deserialize<List<jsonObject>>(json);

好的,我已经找到了一些工作;

我创建了另一个类,命名为childType
public childType
{
   public int a {get;set;}
   public int b {get;set;}
}

然后我声明listType为

 public Dictionary<string,childType> list {get;set;}

字典的键是json (p1,p2,p3,p4)中的子对象的名称,值被分配给childType。

您得到的json格式必须正确转义。你可以使用Json。Net像这样解析它。

JObject obj = JObject.Parse(@"
     {""list"": {
        ""p1"": {
          ""a"": 6,
          ""b"": 7
        },
        ""p2"": {
          ""a"": 1,
          ""b"": 1
        }
       }}
    ");

你说你不确定list内部的属性名称是什么。所以我将使用Children()方法的一个JProperty

//In case you are not sure if `a` or `b` will also change their name go for this using an anonymous type
        var result =    obj.Property("list")
    .Children()
    .Children()
    .Children()
    .Select(x=> new {a =x.Children().ElementAt(0).ToString(), b = x.Children().ElementAt(1).ToString()});
//In case you are sure about `a` and `b` go for this using an anonymous type
        var result =    obj.Property("list")
    .Children()
    .Children()
    .Children()
    .Select(x=> new {a =x["a"].ToString(), b = x["b"].ToString()});
//In case you need a concrete type to store your data,i am using your class `childType`
        public class childType
        {
           public int a {get;set;}
           public int b {get;set;}
        }
            List<childType> lst = obj.Property("list")
    .Children()
    .Children()
    .Children()
    .Select(x=> new childType {a =Convert.ToInt32(x["a"]), b = Convert.ToInt32(x["b"])}).ToList();

我在对JObject了解有限的情况下想出了这个解决方案。