如何反序列化Json对象-C#

时间:2018-10-10 11:12:11

标签: c# json deserialization javascriptserializer

Web服务将JSON对象返回为自爆:

JsonString = "{"d":"[{\"sname\":\"S1\",\"region\":\"R1\",\"name\":\"Q1\"},{\"sname\":\"S2\",\"region\":\"R2\",\"name\":\"Q2\"}]"}"

我尝试通过以下方法反序列化:

  1. 定义对象

    public class RootResponseClass
    {
        public ResponseParametersClass[] d { get; set; }
    }
    
    public class ResponseParametersClass
    {
        public string sname { get; set; }
        public string region { get; set; }
        public string name { get; set; }
    }
    
  2. 编写反序列化方法

     JavaScriptSerializer ser2 = new JavaScriptSerializer();
    
     RootResponseClass obj = new RootResponseClass();
    
     obj = ser2.Deserialize<RootResponseClass>(JsonString);
    

但是它给出了错误“无法将类型为'System.String'的对象转换为类型为'NAS.Helpers.ResponseParametersClass []”,所以我该怎么办!

解决方案

 public class RootResponseClass
    {
        public string d { get; set; }
    }

对于反序列化方法:

JavaScriptSerializer ser2 = new JavaScriptSerializer();
RootResponseClass obj = new RootResponseClass();
obj = ser2.Deserialize<RootResponseClass>(JsonString);

List<ResponseParametersClass> obj2 = new List<ResponseParametersClass>();
obj2 = ser2.Deserialize<List<ResponseParametersClass>>(obj.d.ToString());

2 个答案:

答案 0 :(得分:3)

您可以使用软件包using Newtonsoft.Json;来反序列化JSON

示例

JsonString = "{"d":"[{\"sname\":\"S1\",\"region\":\"R1\",\"name\":\"Q1\"},{\"sname\":\"S2\",\"region\":\"R2\",\"name\":\"Q2\"}]"}";

var foo = JsonConvert.DeserializeObject<RootResponseClass>(JsonString);

foo是您的反序列化对象。

编辑

作为其他信息,为什么初始方法不起作用是因为您的数组以引号开头,因此将其识别为字符串。在"{"d":之后应该只是[],而不是"[]"

感谢Dnomyar96指出了这些额外内容。

答案 1 :(得分:2)

您的Json字符串似乎包含另一个Json字符串。因此,为了对此进行反序列化,您需要像现在这样进行反序列化,但是请将ResponseParametersClass更改为string

然后,您需要反序列化刚得到的字符串(作为List<ResponseParametersClass>)。因此,在这种情况下,您需要分两个步骤进行反序列化。