我目前正在使用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” }
以下是您的ServiceStack.Text
JSON反序列化程序显示响应对象的方式:
---- ---- EDIT 尝试从NuGet获得4.0.62,它给了我一个例外。
消息:'ServiceStack.StringExtensions'的类型初始值设定项引发了异常。对象引用未设置为对象的实例,在ServiceStack.StringExtensions..cctor()[0x00017]中:0
-----编辑-----
URL to a file containing the JSON class
Here's a video demonstrating the usage differences and the strange output
答案 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。包含空值更加脆弱,必须满足空虚的多种定义,禁止版本控制并且只是增加有效载荷。