【问题标题】:How to Deserialize Json Object - C#如何反序列化 Json 对象 - C#
【发布时间】:2018-10-10 11:12:11
【问题描述】:

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());

【问题讨论】:

  • Json 中的 d 不包含数组,而是字符串。如果它是一个数组,它会像 [ 而不是 "[ 开始。所以看起来 Json 包含另一个 Json 字符串。
  • 我推荐使用 Newtonsoft.Json
  • @Dnomyar96 感谢您的评论帮助我找到答案。
  • 我厌倦了这两个,另一个答案也有效,但使用另一种方法,但就像你说的问题不在于方法,它在于我如何处理 json 字符串,所以我做了你在评论中推荐的,效果很好。

标签: c# json deserialization javascriptserializer


【解决方案1】:

您可以使用包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 指出了这一点。

【讨论】:

  • 这实际上对 OP 没有帮助。他的问题出在Json字符串上,而不是反序列化的方法上。他的方法和这个一样有效。
  • @H. Mikhaeljan,请解释数组不起作用,您将其更改为列表以使其工作,我没有得到这个东西。
  • @AnirudhaGupta 列表没有做出改变,它也可能只是一个数组,我更习惯于使用列表,请原谅我的混乱变化。
  • @H.Mikhaeljan 好的
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多