unity Restsharp Api Json 序列化和反序列化

Posted

技术标签:

【中文标题】unity Restsharp Api Json 序列化和反序列化【英文标题】:Unity Restsharp Api Json Serialization & Deserialization 【发布时间】:2022-01-20 06:07:19 【问题描述】:

我正在开发一款多人游戏。我有一个朋友在 Swagger.io 上开发 API。所以这是我的问题:

我想使用我可以使用的 Task 函数,而不是 Unity 自己的 UnityWebRequest 函数。 我看了一下,做了一些研究,写了如下代码。

    private async Task<T> Send<T>(string service, object obj)

    RestClient client = new RestClient(baseUrl);
    RestRequest request = new RestRequest(service)
    
        RequestFormat = DataFormat.Json,
        Method = Method.POST,
    ;
#if UNITY_android
        uniqueID = SystemInfo.deviceUniqueIdentifier;
        platform = "1";
#endif
#if UNITY_ios
        uniqueID = UIDevice.identifierForVendor
        platform = "0";
#endif
        request.AddHeader("DeviceID", uniqueID);
        request.AddHeader("BundleID", Application.identifier);
        request.AddHeader("BuildID", "0");
        request.AddHeader("Platform", platform);
        request.AddHeader("Version", "0");
        request.AddJsonBody(obj);

        var response = await client.ExecuteAsync(request);

        if (response.Content != null && response.StatusCode == HttpStatusCode.OK)
        
            var jsonSerializerSetting = new JsonSerializerSettings  NullValueHandling = NullValueHandling.Ignore, MissingMemberHandling = MissingMemberHandling.Ignore ;
            var result = JsonConvert.DeserializeObject<T>(response.Content, jsonSerializerSetting);
            return result;
        
        else
        
            return default;
        

因为它是一个异步函数,所以我用 await 调用它没有任何问题。像这样:

我有一些课程可以响应其他课程:

[Serializable]
public class WelcomeRequest : Response

    public string Location;
    public string Language;

[Serializable]
public class WelcomeRequest : Response

    public string Location;
    public string Language;
[Serializable]
public class WelcomeResponse : Response

    public WelcomePayload Payload;


[Serializable]
public class WelcomePayload : Response

    public Player Player;
    public Settings Settings;
    public Season Play;
    public Season Purchase;
    public Game GameOfSeason;
    public Game[] Games;
    public double PrizePool;

(我知道这是一个大项目,子类很多。我不想让你为我写代码,我只是想让你解释一下我写的代码的逻辑和一个我可以参考的例子. 更别说我一个人在努力了。除了你我没有任何朋友可以帮助你。) 我能够从服务器接收 json 格式的文件。但是由于这个函数只返回对象,我不能分配类的子对象。我是否需要再次将其转换为 json 格式并反序列化?由于我之前使用的是 Firebase 基础架构,因此我能够毫无问题地进行通信。我查找了 Restsharp Unity 教程,但没有找到。你能帮助我吗?至少如果你指导我,我会尝试自己解决它。如果我没有正确表达自己,我很抱歉,因为这是我在这个网站上的第一篇文章,我不太了解规则。 无尽的感谢你们。

【问题讨论】:

我不明白你的问题...But since this function only returns the object, I cannot assign sub-objects of the class. .. 为什么不呢?如果这返回让我们说一个WelcomeResponse 是什么阻碍你访问例如Payload.Player 等等...? 我可以从服务器获取数据。例如 Language = ENG,LanguageCode = 0,LanguageFlag = ENGFLAG 等。我可以获取数据,但是当我尝试从例如 Localization 类设置默认语言(包括上述信息,如 LanguageCode )时,我无法解析 json 文件。由于我将其保留为数组,因此我将该问题列为数组并解决了它。 【参考方案1】:

这并不能真正回答您的问题,但您可能需要考虑使用生成的客户端。

如果 API 是用 swagger 制作的,您应该能够使用 openapi-generator 和 Swagger Schema 制作 C# API 客户端。然后只需构建生成的项目并将 DLL 放入统一项目的 Assets 文件夹中。

您可能还需要包含RestSharp 和Newtonsoft.Json。只需下载这些 NuGet 包并解压缩它们(nupkg 文件只是 zip),dll 应该在其中。通过将 DLL 放到 Assets 文件夹中来包含它。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 我想我很难过,因为我不知道如何创建招摇方案。我的项目中已经存在 RestSharp 和 Newtonsoft.Json dll。我拉数据没有任何问题,但是我无法从服务器同步类中的值,因为我没有根据架构拉数据。我现在脑子里灯火通明。感谢您的快捷方式。我会尝试测试它并(希望)积极地与代码分享结果。

以上是关于unity Restsharp Api Json 序列化和反序列化的主要内容,如果未能解决你的问题,请参考以下文章

通过 RestSharp C# 将 JSON 数组发布到 PHP API

RestSharp JSON参数发布

RestSharp JSON 参数发布

使用 RestSharp 发送 HTTP POST Multipart/form-data 字段

使用 restsharp 反序列化 json 字符串

RestSharp用法小结