JSON Newtonsoft C#反序列化数组

JSON Newtonsoft C# deserialize array

我有以下 json 但我无法反序列化 usernames:

来源

[
  {
    "id": 116,
    "FUNId": "UPmAkP",
    "status": "active",
    "usernames": "[{\"user\":\"lalala1\",\"alive\":true,\"number\":\"00\"},{\"user\":\"lalala2\",\"alive\":true,\"number\":\"36\"},{\"user\":\"lalala3\",\"alive\":false,\"number\":\"18\"}]",
    "startRegistration": "1624763432000",
    "startPlay": "1624772732000",
    "end": "1624773632000"
  }
] 

型号类

public class JSON
{
    [JsonProperty("startRegistration"), JsonConverter(typeof(UnixTimestampConverter))]
    public DateTime startRegistration { get; set; }
    
    [JsonProperty("startPlay"), JsonConverter(typeof(UnixTimestampConverter))]
    public DateTime startPlay{ get; set; }
    
    [JsonProperty("end"), JsonConverter(typeof(UnixTimestampConverter))]
    public DateTime ended { get; set; }
    
    [JsonProperty("usernames"), JsonConverter(typeof(JsonToArrayConverter<Players>))]
    public Players[] usernames { get; set; }
}
public class Players
{
    [JsonProperty("user")]
    public string user { get; set; }
    
    [JsonProperty("alive")]
    public bool alive { get; set; }
                  
    [JsonProperty("number")]
    public string number { get; set; }
}

转换器

public class JsonToArrayConverter<Players> : CustomCreationConverter<Players[]>
{
    public override Players[] Create(Type objectType)
    {
        return new Players[0];
    }

    public override object ReadJson(JsonReader reader, Type objectType, object
        existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartArray)
        {
            object result = serializer.Deserialize(reader, objectType);
            return result;
        }
        else
        {
            var resultObject = serializer.Deserialize<Players>(reader);
            return new Players[] { resultObject };
        }
    }
}
class UnixTimestampConverter : JsonConverter
{
    static readonly DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

    public override bool CanConvert(Type objectType)
    {
        return typeof(DateTime).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        long timestamp = serializer.Deserialize<long>(reader);
        return unixEpoch.AddMilliseconds(timestamp+10800000);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var date = (DateTime)value;
        var utcDate = date.ToUniversalTime();
        var timestamp = (int)(utcDate - unixEpoch).TotalSeconds;

        serializer.Serialize(writer, timestamp);
    }
}

问题

当我尝试这个时:

var foos = JsonConvert.DeserializeObject<List<JSON>>(FIRST); 

然后我得到这个错误:

Newtonsoft.Json.JsonSerializationException: "Error converting value [{"user":"lalala1","alive":true,"number":"00"},{"user":"lalal a2","alive":true,"number":"36"},{"user":"lalala3","alive":fa lse,"number":"18"}]

你有一个错误,从用户名数组中删除“\”

"usernames": [{"user":"lalala1","alive":true,"number":"00"},{"user":"lalala2","alive":true,"number":"36"},{"user":"lalala3","alive":false,"number":"18"}]

现在你可以反序列化它了

var jsonDeserialized = JsonConvert.DeserializeObject<Data[]>(json); 

你的类应该是

public class Username
{
    public string user { get; set; }
    public bool alive { get; set; }
    public string number { get; set; }
}

public class Data
{
    public int id { get; set; }
    public string FUNId { get; set; }
    public string status { get; set; }
    public List<Username> usernames { get; set; }
    public string startRegistration { get; set; }
    public string startPlay { get; set; }
    public string end { get; set; }
}

并修复您的 json。应该是

[
   {
      "id":116,
      "FUNId":"UPmAkP",
      "status":"active",
      "usernames":[
         {
            "user":"lalala1",
            "alive":true,
            "number":"00"
         },
         {
            "user":"lalala2",
            "alive":true,
            "number":"36"
         },
         {
            "user":"lalala3",
            "alive":false,
            "number":"18"
         }
      ],
      "startRegistration":"1624763432000",
      "startPlay":"1624772732000",
      "end":"1624773632000"
   }
]
[JsonProperty("usernames")]
private string UserNamesJson { get; set; }

public UserName[] UserNames
{
    get => JsonConvert.DeserializeObject<UserName[]>(UserNamesJson);
    set => UserNames = value;
}

这段代码工作正常。