【问题标题】:Deserialization of a json string returns null valuesjson字符串的反序列化返回空值
【发布时间】:2012-04-23 16:24:09
【问题描述】:

这是 JSON 字符串 -

"{\"body\":[\"VAL1\",\"VAL2\"],\"head\":{\"result\":true,\"time\":3.859}}"

这些是我的课 -

[Serializable]
public class ResponseHead
{               
    public bool result {get; set;}              
    public float time {get; set;}
}

[Serializable]
public class ResponseBody
{        
    public string[] body {get; set;}
}

[Serializable]
public class ResponseObj
{        
    public ResponseBody body {get; set;}
    public ResponseHead head { get; set; }
}

还有代码 -

JavaScriptSerializer serializer = new JavaScriptSerializer();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
    responseText = streamReader.ReadToEnd();
}
ResponseObj response_obj = new ResponseObj();

ResponseHead rhead = new ResponseHead();
rhead = serializer.Deserialize<ResponseHead>(responseText); //not working

生成的 ResponseHead 对象具有值:

result: false 
time: 0.0 

它无法正确映射值,但我不知道为什么。 ResponseBody 值正确输入。

请帮忙!

【问题讨论】:

  • 如果您将值放在 json 中的字符串中,您将看到它们
  • [Serializable] 对您之前的问题有效吗? stackoverflow.com/questions/10253436/…
  • 不,我已经添加了在那里工作的答案。这只是类型的改变。不过感谢您的回答,它可能使我免于将来的错误。

标签: c# asp.net json javascriptserializer


【解决方案1】:

看起来您正在尝试读取 ResponseObj(这是您的 JSON 中的顶级对象),但编码为 ResponseHead。以下应该工作:

var wholeObject = serializer.Deserialize<ResponseObj>(responseText);
rhead = wholeObject.head;

【讨论】:

  • 这给了我一个错误提示 - 不支持数组的反序列化,因为 ResponseBody 是一个数组。因此,我试图分别获取这些值。如果我从 ResponseObj 中删除 ResponseBody 并且只保留 ResponseHead 然后获取整个对象的值,它确实有效。但是,单独获取 ResponseHead 的值是行不通的。
  • 只需将 ResponseBody 更改为 sting 数组。如果无法更改 json 对象。
  • 如果您无法内置序列化器(DataContractJsonSerializer 和 JavaScriptSerializer)来处理您的 JSON,请考虑 JSON.net,它提供了更多选项。
  • @TimBJames:我考虑过使用 JSON.NET,它给了我一个更具描述性的错误,这让我意识到问题在于不将 string[] 包装到 ResponseBody 对象中。我摆脱了那个对象,直接让我的 ResponseObject 有一个 string[] 作为主体。刚回到 SO 并阅读 Tims 的回复,要求我这样做!在此之后,使用 JavaScriptSerializer 也能正常工作。
猜你喜欢
  • 1970-01-01
  • 2019-07-11
  • 2019-09-09
  • 1970-01-01
  • 2022-12-03
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多