改变 ServiceStack.Text JSON 解串器的输出
Alter output of ServiceStack.Text JSON Deserializer
我目前正在使用 Newtonsoft.json
nuget 包,但我想找到一个更快的替代方案。 ServiceStack.Text
似乎解析了它,但它 return 以我期望的不同格式对 JSON 进行了处理。无论如何要更改此 return 对象的格式以符合我的期望?
问题是反序列化后,response.fullName
returns "joey cool"如预期的那样Newtonsoft.json
但是ServiceStack.Text
将 return 变成 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": "individual",
"createdDate": 1440104822411,
"phoneNumber": "15555555555",
"timezone": "America/Los_Angeles",
"photo": "https://stringify.s3.amazonaws.com/users/fc7b4c4e0b6660c7daf711b1d17e0039-profile.jpg",
"name": "default",
"type": "api"
}
下面是调试器如何显示 Newtonsoft.json
对象:
下面是您的 ServiceStack.Text
JSON 解串器如何显示响应对象:
----编辑----
从 NuGet 尝试了 4.0.62,它给了我一个例外。
消息:'ServiceStack.StringExtensions' 的类型初始值设定项抛出异常。对象引用未设置为对象实例,位于 ServiceStack.StringExtensions..cctor () [0x00017] in :0
-----编辑-----
URL to a file containing the JSON class
Here's a video demonstrating the usage differences and the strange output
您可以尝试使用ServiceStack.Textwhich is now free from v4.0.62+ and is available in all Xamarin platforms的最新v4。
自 v3 以来,它添加了许多改进,因此如果此行为是 v3 中的错误导致的,它现在可能已修复。
编辑:
您尝试序列化的 class 无效,ServiceStack 序列化字典或具有 public 属性的 POCO classes,它不会同时执行这两种操作,例如:
[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; }
}
我会删除 Inheriting the dictionary,因为让 class 包含一个字典然后从一个字典继承它的互操作性要好得多。此外,您的 [JsonProperty]
属性是 JSON.NET 特定的,并且在其他序列化程序中没有影响,因此我将您的 class 重写为:
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 更脆弱,必须满足空的多重定义,抑制版本控制并且只会使有效负载膨胀。
我目前正在使用 Newtonsoft.json
nuget 包,但我想找到一个更快的替代方案。 ServiceStack.Text
似乎解析了它,但它 return 以我期望的不同格式对 JSON 进行了处理。无论如何要更改此 return 对象的格式以符合我的期望?
问题是反序列化后,response.fullName
returns "joey cool"如预期的那样Newtonsoft.json
但是ServiceStack.Text
将 return 变成 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": "individual", "createdDate": 1440104822411, "phoneNumber": "15555555555", "timezone": "America/Los_Angeles", "photo": "https://stringify.s3.amazonaws.com/users/fc7b4c4e0b6660c7daf711b1d17e0039-profile.jpg", "name": "default", "type": "api" }
下面是调试器如何显示 Newtonsoft.json
对象:
下面是您的 ServiceStack.Text
JSON 解串器如何显示响应对象:
----编辑---- 从 NuGet 尝试了 4.0.62,它给了我一个例外。
消息:'ServiceStack.StringExtensions' 的类型初始值设定项抛出异常。对象引用未设置为对象实例,位于 ServiceStack.StringExtensions..cctor () [0x00017] in :0
-----编辑-----
URL to a file containing the JSON class
Here's a video demonstrating the usage differences and the strange output
您可以尝试使用ServiceStack.Textwhich is now free from v4.0.62+ and is available in all Xamarin platforms的最新v4。
自 v3 以来,它添加了许多改进,因此如果此行为是 v3 中的错误导致的,它现在可能已修复。
编辑:
您尝试序列化的 class 无效,ServiceStack 序列化字典或具有 public 属性的 POCO classes,它不会同时执行这两种操作,例如:
[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; }
}
我会删除 Inheriting the dictionary,因为让 class 包含一个字典然后从一个字典继承它的互操作性要好得多。此外,您的 [JsonProperty]
属性是 JSON.NET 特定的,并且在其他序列化程序中没有影响,因此我将您的 class 重写为:
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 更脆弱,必须满足空的多重定义,抑制版本控制并且只会使有效负载膨胀。