C# 自定义对象的序列化列表
Serialise list of C# custom objects
我从 API 收到一个 JSON 字符串,该字符串的结构不适合在应用程序中处理。
我选择为此 JSON 数据创建一个自定义序列化程序(而不是为应用中接收和使用的数据创建两个不同的 classes)。
根据大量教程,我设法为单个对象组合了一个自定义序列化程序。但是,我需要处理这些对象的列表(这些奇怪的列表中会出现更多不同的数据,需要自定义处理)。
是否有内置方法可以设置我的自定义序列化程序以处理列表中的每个对象?或者我是否需要手动拆分 JSON 对象,并将其块提供给自定义序列化程序?
如有任何其他如何处理这种情况的建议,我们将不胜感激。
用户class:
[JsonConverter(typeof(UserSerializer))]
public class User
{
public int id;
public string displayName;
public string email;
public int total_points;
public float total_values;
}
解串器:
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
JObject jObjectRoot = JObject.Load(reader);
var root = jObjectRoot.Properties().ToList();
JObject jObjectData = JObject.Load(root[2].Value.CreateReader());
var data = jObjectData.Properties().ToList();
return new User {
id = (int)root[1].Value,
displayName = (string)data[0].Value,
email = (string)data[1].Value,
total_points = (int)data[2].Value,
total_values = (float)data[3].Value
};
}
更新:
还有将 json 字符串解析为单个用户对象的代码:
public static void ProcessJSON(string json)
{
User user = JsonConvert.DeserializeObject<User>(json);
}
以及 JSON 本身:
[
{
"type": "users",
"id": 1,
"attr": {
"display_name": "user2",
"email": "user2@email.com",
"total_points": 4,
"total_values": 32.34
},
"relationships": {
"points_received": {
"links": {
"self": "tipjar/users/1/relationships/points",
"related": "tipjar/users/1/points"
}
},
"points_given": {
"links": {
"self": "tipjar/users/1/relationships/awarded",
"related": "tipjar/users/1/awarded"
}
}
}
}
]
谢谢
public static void ProcessJSON(string json)
{
User u = new User();
var test = JsonConvert.DeserializeObject(json);
if (test.GetType() == typeof(User))
u = (User)test;
}
不是 100% 了解序列化的工作原理,但这似乎适用于我制作的测试应用程序。
这可能有点傻。但是您可以测试返回的不同类型的对象...
您可以像这样在没有自定义转换器的情况下获取用户对象列表:
var userList = JArray.Parse(json)
.Select(t => new User()
{
id = int.Parse(t["id"].ToString()),
displayName = t["attr"]["display_name"].ToString(),
email = t["attr"]["email"].ToString(),
total_points = int.Parse(t["attr"]["total_points"].ToString()),
total_values = float.Parse(t["attr"]["total_values"].ToString()),
}).ToList();
我从 API 收到一个 JSON 字符串,该字符串的结构不适合在应用程序中处理。
我选择为此 JSON 数据创建一个自定义序列化程序(而不是为应用中接收和使用的数据创建两个不同的 classes)。
根据大量教程,我设法为单个对象组合了一个自定义序列化程序。但是,我需要处理这些对象的列表(这些奇怪的列表中会出现更多不同的数据,需要自定义处理)。
是否有内置方法可以设置我的自定义序列化程序以处理列表中的每个对象?或者我是否需要手动拆分 JSON 对象,并将其块提供给自定义序列化程序?
如有任何其他如何处理这种情况的建议,我们将不胜感激。
用户class:
[JsonConverter(typeof(UserSerializer))]
public class User
{
public int id;
public string displayName;
public string email;
public int total_points;
public float total_values;
}
解串器:
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
JObject jObjectRoot = JObject.Load(reader);
var root = jObjectRoot.Properties().ToList();
JObject jObjectData = JObject.Load(root[2].Value.CreateReader());
var data = jObjectData.Properties().ToList();
return new User {
id = (int)root[1].Value,
displayName = (string)data[0].Value,
email = (string)data[1].Value,
total_points = (int)data[2].Value,
total_values = (float)data[3].Value
};
}
更新:
还有将 json 字符串解析为单个用户对象的代码:
public static void ProcessJSON(string json)
{
User user = JsonConvert.DeserializeObject<User>(json);
}
以及 JSON 本身:
[
{
"type": "users",
"id": 1,
"attr": {
"display_name": "user2",
"email": "user2@email.com",
"total_points": 4,
"total_values": 32.34
},
"relationships": {
"points_received": {
"links": {
"self": "tipjar/users/1/relationships/points",
"related": "tipjar/users/1/points"
}
},
"points_given": {
"links": {
"self": "tipjar/users/1/relationships/awarded",
"related": "tipjar/users/1/awarded"
}
}
}
}
]
谢谢
public static void ProcessJSON(string json)
{
User u = new User();
var test = JsonConvert.DeserializeObject(json);
if (test.GetType() == typeof(User))
u = (User)test;
}
不是 100% 了解序列化的工作原理,但这似乎适用于我制作的测试应用程序。
这可能有点傻。但是您可以测试返回的不同类型的对象...
您可以像这样在没有自定义转换器的情况下获取用户对象列表:
var userList = JArray.Parse(json)
.Select(t => new User()
{
id = int.Parse(t["id"].ToString()),
displayName = t["attr"]["display_name"].ToString(),
email = t["attr"]["email"].ToString(),
total_points = int.Parse(t["attr"]["total_points"].ToString()),
total_values = float.Parse(t["attr"]["total_values"].ToString()),
}).ToList();