如何为 System.Serializable 类设置自定义 json 字段名称?

Posted

技术标签:

【中文标题】如何为 System.Serializable 类设置自定义 json 字段名称?【英文标题】:How to set custom json field name for System.Serializable class? 【发布时间】:2018-04-17 09:51:20 【问题描述】:

我正在从服务器获取响应:


    "auth_token": "062450b9dd7e189f43427fbc5386f7771ba59467"

为了访问它,我需要使用与原始 JSON 相同的名称。

[System.Serializable]
public class TokenResponse

    public string auth_token; // I want to rename it to authToken without renaming corresponding field in json
    public static TokenResponse CreateFromJSON(string json) 
        return JsonUtility.FromJson<TokenResponse>(json);
    

如何在不丢失功能的情况下将 TokenResponse.auth_token 重命名为 TokenResponse.authToken?

【问题讨论】:

[JsonProperty("auth_token")]public string AuthToken get;set;(如果你使用 Json.Net) 不,我正在使用 Mono (Unity3d) 【参考方案1】:

@Mike Mat's answer 接近于 Unity 的一个很好的解决方案,但不幸的是它并不能很好地工作(因为Unity never serializes C# properties)

这是他的答案的一个变体,它在 Unity 中编译并正常工作(在 Unity 2018.3.1 中测试)

[System.Serializable]
public class TokenResponse

    [SerializeField] private string auth_token;
    public string authToken  get  return auth_token;  

    public static TokenResponse CreateFromJSON(string json) 
        return JsonUtility.FromJson<TokenResponse>(json);
    

【讨论】:

【参考方案2】:

使用JsonDotNet 代替JsonUtility

这样做:

[System.Serializable]
public class TokenResponse

    // what is `JsonProperty` see:https://www.newtonsoft.com/json/help/html/JsonPropertyName.htm
    [JsonProperty("auth_token")] 
    public string authToken set; get; 

    public static TokenResponse CreateFromJSON(string json) 
        return JsonConvert.DeserializeObject<TokenResponse>(json);
    

【讨论】:

【参考方案3】:

我想这是 Unity 的代码。不幸的是,它似乎不允许您立即更改 JSON 字符串的键名。

但是the documentation 说您可以使用 [NonSerialized] 属性来省略字段。所以下面的代码可能会让你做你想做的事。

[System.Serializable]
public class TokenResponse

    [NonSerialized]
    public string AuthToken;

    public string auth_token  get  return AuthToken;  

    public static TokenResponse CreateFromJSON(string json)
    
        return JsonUtility.FromJson<TokenResponse>(json);
    

希望这会有所帮助。

【讨论】:

这不起作用,因为 Unity 从不序列化属性——所以你基本上是在告诉 Unity 的 JsonUtility “不要寻找名为 "AuthToken" 的键,因为我指定了 [NonSerialized] ;并且不要寻找名为 "auth_token" 的键,因为它是一个属性。” 请参阅下面我的答案以获取有效的版本(如果您想更新,我很乐意删除我的答案你的答案。;-D) @SlippD.Thompson 是对的,请更新答案

以上是关于如何为 System.Serializable 类设置自定义 json 字段名称?的主要内容,如果未能解决你的问题,请参考以下文章

Serializable作用

Serializable 作用

如何为 iOS 项目创建类引用,如 NSDictionary 类引用 - Apple Developer

django:DetailView 如何为两个模型工作或基于类的视图如何为两个模型工作?

C# System.Serializable() 问题

如何为引用自身的案例类提供 JsonFormats?