我从套接字连接接收到未知字符串。它始终遵循格式
{
“eventType”: “playerListUpdate”
“data”: “...changes...”
}
我正在使用以下方法对其进行反序列化:
var message = JsonConvert.DeserializeObject<NetworkMessage>(data);
NetworkMessage 如下所示:
public class NetworkMessage
{
public string data;
public string eventType;
}
我的问题是,有时数据属性保留为字符串,而其他时候它包含具有更复杂数据的数组(想想数据库结果)。因此,当我尝试用数据中的数组反序列化字符串时,它会失败。
更复杂数据的示例是
{"eventType":"latestPlayersList","data":[{"id":1,"firstName":"Harry"},{"id":2,"firstName":"Ted"},{"id":3,"firstName":"Michael"},{"id":4,"firstName":"Mike"}],"from":"server"}
如何根据 eventType 的值将 JSON 字符串反序列化为不同的 VO?
最佳答案
反序列化的一种方法是直接转到 JObject
var jObject = JsonConvert.DeserializeObject<JObject>(json);
现在您可以像这样访问属性值:
var eventType = jObject.Value<string>("eventType")
现在您还可以扩展它来检查 eventType
的值,然后反序列化为正确的对象类型。所以我们可以有一个像这样的通用类:
public class NetworkMessage<T>
{
public string EventType;
public T Data;
}
public class Player
{
public int Id { get; set; }
public string FirstName { get; set; }
}
并根据eventType
的值决定我们使用什么泛型类型。请注意,这不是世界上最有效的代码,因为它反序列化两次,但它会起作用:
private void ProcessJson(string json)
{
var jObject = JsonConvert.DeserializeObject<JObject>(json);
switch (jObject.Value<string>("eventType"))
{
case "playerListUpdate":
HandlePlayerListUpdate(jObject.ToObject<NetworkMessage<string>>());
break;
case "latestPlayersList":
HandleLatestPlayersList(jObject.ToObject<NetworkMessage<List<Player>>>());
break;
}
}
private void HandlePlayerListUpdate(NetworkMessage<string> playerListUpdateMessage)
{
Console.WriteLine($"Player list update: {playerListUpdateMessage.Data}");
}
private void HandleLatestPlayersList(NetworkMessage<List<Player>> latestPlayersListMessage)
{
Console.WriteLine($"Latest Players list: {latestPlayersListMessage.Data.Count} players");
}
关于c# - 将未知的 JSON 字符串转换为正确的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51000648/