ServiceStack.Text and DeserializeFromString

3

我必须承认,我可能忘记了一些非常简单的东西,但我弄不清楚是什么。

我有一个类:

public class UserAgentInfo
{
    public string agent_type { get; set; }
    public string agent_name { get; set; }
    public string agent_version { get; set; }

    public string os_type { get; set; }
    public string os_name { get; set; }
    public string os_versionName { get; set; }
    public string os_versionNumber { get; set; }

    public string linux_distibution { get; set; }
}

然后我从Url获取Json字符串,尝试将其反序列化为:

using (System.Net.WebClient wc = new System.Net.WebClient())
{
    string json = wc.DownloadString("http://www.useragentstring.com/?getJSON=agent_type-agent_name-agent_version-os_type-os_name-os_versionName-os_versionNumber-linux_distibution&uas=" + o.Browser);

    agentInfo = ServiceStack.Text.TypeSerializer.DeserializeFromString<UserAgentInfo>(json);
}

JSON字符串如下:

"{\"agent_type\":\"Browser\",\"agent_name\":\"Chrome\",\"agent_version\":\"28.0.1500.72\",\"os_type\":\"Windows\",\"os_name\":\"Windows 7\",\"os_versionName\":\"\",\"os_versionNumber\":\"\",\"linux_distibution\":\"Null\"}"

或者对于不习惯使用C#的人来说

"{"agent_type":"Browser","agent_name":"Chrome","agent_version":"28.0.1500.72","os_type":"Windows","os_name":"Windows 7","os_versionName":"","os_versionNumber":"","linux_distibution":"Null"}"

返回的对象是:

{...UserAgentInfo}
   agent_name: null
   agent_type: null
   agent_version: null
   linux_distibution: null
   os_name: null
   os_type: null
   os_versionName: null
   os_versionNumber: null

我错过了什么?


1
如果返回的字符串字面上就是你在问题中写的,包括开头和结尾的双引号以及中间转义的引号,那么它将被解析为一个字符串而不是一个对象。应该长这样:{"agent_type":"Browser","agent_name":"Chrome",...} - JimmiTh
C# 中,包含特殊字符(如 ")的字符串必须进行转义,因此需要使用 \"... - balexandre
那不是重点。你的JSON字符串不是在C#中写的字符串文字,而是从服务返回的字符串。如果该字符串以"开头和结尾,并转义所有其他"字符,则不会将其解析为JSON对象,而是作为单个JSON字符串。这就是为什么我要问:上面的内容是否确切地是您得到的返回值 - 还是例如Visual Studio调试器显示的内容? - JimmiTh
...当我在“立即窗口”中看到它时,它总是被转义!该字符串是一个正常且有效的JSON字符串,所以请不要抱怨我的字符串:P - balexandre
没错 - 发现它是一个实际的服务URL,所以尝试了一下,响应是正确的。 - JimmiTh
尝试帮忙,而不是抱怨任何事情。无论VS调试器在即时窗口中显示什么,json的值都不会是你上面写的那样,也永远不会是那样。如果它,那么这就解释了为什么它无法正确解析。"不习惯C#"是一个大胆的说法。"人们期望你给出字符串的实际值,而不是调试器中的表示"可能更准确。我现在会停止"抱怨"了。 :-) - JimmiTh
1个回答

4
我相信您想要使用以下内容来反序列化JSON字符串:
ServiceStack.Text.JsonSerializer.DeserializeFromString<UserAgentInfo>(json)

TypeSerializer 是为 JSV 格式 (json-csv-jsv-serializers) 设计的。


2
有人需要更改Simple API中的文档,这就是我遇到这个问题的原因:https://github.com/ServiceStack/ServiceStack.Text#simple-api :) - balexandre
是的,它是从原始博客文章中完全复制过来的,但在新的上下文中,它似乎是关于所有序列化程序的。此外,“TypeSerializer”总让我感到名称选择混淆(我在问题代码中也没有发现它)。“JsvSerializer”有什么问题呢?但经过三年,我想现在改变它已经太晚了。 :-) - JimmiTh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接