【问题标题】:How to set custom json field name for System.Serializable class?如何为 System.Serializable 类设置自定义 json 字段名称?
【发布时间】: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)

标签: c# json unity3d mono deserialization


【解决方案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 是对的,请更新答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多