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

时间:2017-11-04 23:09:42

标签: c# json unity3d mono deserialization

我从服务器获取该响应:

{
    "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?

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

我想这是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);
    }
}

希望这有帮助。

答案 2 :(得分:0)

使用JsonDotNet代替JsonUtility

只需执行以下操作:

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

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