c# - 将未知的 JSON 字符串转换为正确的对象

标签 c# json unity-game-engine

我从套接字连接接收到未知字符串。它始终遵循格式

{
    “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/

相关文章:

user-interface - 在 Unity 中从像素坐标转换为 UI 坐标

c# - 以编程方式将相机置于 unity3d 中的对象上

c# - 字符串在c#中的xpath中连接多个属性值

c# - 从包含一系列基于文件名进行版本控制的文件的文件夹中查找文件

c# - 在 WCF ServiceHost 中提供工厂而不是类型

json - Neo4j : best alternative to storing nested properties?

javascript - jQuery 动态从 JSON 文件获取数据

python - 我可以用 Python 替换 JSON 键中的部分字符串吗?

c# - 如何在 GTK TextView 中自动滚动到底部

android - 使用 Vuforia AR 时对象不亮