更改ServiceStack.Text JSON反序列化器

时间:2016-08-12 06:16:04

标签: c# .net json xamarin servicestack-text

我目前正在使用Newtonsoft.json nuget包,但我想找到更快的替代品。 ServiceStack.Text似乎在解析它,但是它以我期望的不同格式返回JSON。反正有没有改变它返回对象的格式以匹配我期望的格式?

问题,在反序列化后,response.fullName按照Newtonsoft.json的预期返回“joey cool”,但ServiceStack.Text将返回null因为格式不同。

我可以更改ServiceStack.Text的输出格式,使其与我期望的一致吗?我想打电话给response.fullName并获得“joey cool”。

以下是使用ServiceStack.Text组件的代码:

T response = a_response.Content.FromJson<T>();

以下是我使用Newtonsoft.json的代码:

T response = JsonConvert.DeserializeObject<T>(a_response.Content);

以下是文本中JSON的输出结果:

  

{     “userId”:“fc7b4c4e0b6660c7daf711b1d17e0039”,     “emailAddress”:“joey+100@stringify.com”,     “fullName”:“joey cool”,     “accountType”:“个人”,     “createdDate”:1440104822411,     “phoneNumber”:“15555555555”,     “timezone”:“America / Los_Angeles”,     “照片”:“https://stringify.s3.amazonaws.com/users/fc7b4c4e0b6660c7daf711b1d17e0039-profile.jpg”,     “名称”:“默认”,     “type”:“api”   }

以下是调试器显示Newtonsoft.json对象的方式: enter image description here

以下是您的ServiceStack.Text JSON反序列化程序显示响应对象的方式: enter image description here

---- ---- EDIT 尝试从NuGet获得4.0.62,它给了我一个例外。

消息:'ServiceStack.StringExtensions'的类型初始值设定项引发了异常。对象引用未设置为对象的实例,在ServiceStack.StringExtensions..cctor()[0x00017]中:0

enter image description here

-----编辑-----

URL to a file containing the JSON class

Here's a video demonstrating the usage differences and the strange output

1 个答案:

答案 0 :(得分:1)

您可以尝试使用ServiceStack.Text which is now free from v4.0.62+最新版本v4 ,并available in all Xamarin platforms

自v3以来,它已经添加了很多改进,所以如果这种行为是v3中的错误导致的,那么它现在可能已经修复了。

编辑:

您尝试序列化的这个类是无效的,ServiceStack要么使用公共属性序列化Dictionaries或POCO类,要么两者都没有,例如:

[JsonObject (MemberSerialization.OptIn)]
public class UserDataDict : Dictionary<string, object>
{
    [JsonProperty]
    public string userID { get; set; }
    [JsonProperty]
    public string emailAddress { get; set; }
    [JsonProperty]
    public string fullName { get; set; }
    [JsonProperty]
    public string accountType { get; set; }
    [JsonProperty]
    public string units { get; set; }
    [JsonProperty]
    public string unitsDistance { get; set; }
    [JsonProperty]
    public string newsletterSub { get; set; }

    [JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
    public string location { get; set; }
    [JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
    public string phoneNumber { get; set; }
    [JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
    public string address { get; set; }
    [JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
    public string photo { get; set; }
    [JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
    public string createdDate { get; set; }
    [JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
    public string verifyURL { get; set; }
    [JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
    public string timezone { get; set; }
    [JsonProperty (NullValueHandling = NullValueHandling.Include)]
    public APIManifestDict apiManifest { get; set; }
}

我会删除继承字典,因为它可以让你的类包含一个字典,然后从一个字典继承,它可以更加互操作。此外,您的[JsonProperty]属性是特定于JSON.NET的,并且对其他序列化程序没有影响,因此我将您的类重写为:

public class UserData
{
    public string userID { get; set; }
    public string emailAddress { get; set; }
    public string fullName { get; set; }
    public string accountType { get; set; }
    public string units { get; set; }
    public string unitsDistance { get; set; }
    public string newsletterSub { get; set; }

    public string location { get; set; }
    public string phoneNumber { get; set; }
    public string address { get; set; }
    public string photo { get; set; }
    public string createdDate { get; set; }
    public string verifyURL { get; set; }
    public string timezone { get; set; }
    public APIManifestDict apiManifest { get; set; }

    public Dictionary<string,string> Metadata { get; set; }
}

如果要包含空值,可以使用以下命令指定它:

JsConfig.IncludeNullValues = true;

但我建议您依赖于空值的存在来反对您的应用,因为如果它们未包含在JSON有效负载中,则属性自然为null。包含空值更加脆弱,必须满足空虚的多种定义,禁止版本控制并且只是增加有效载荷。