【问题标题】:Unexpected character encountered while parsing value from API从 API 解析值时遇到意外字符
【发布时间】:2019-03-16 20:42:18
【问题描述】:

返回一些 Json 数据的 API 有点问题。 以下是数据样本:

"player": {
    "_id": "ID",
    "achievements": {
    "achievementsOneTime": [
        "supersmash_tinman_challenge",
        [],
        "blitz_kill_without_kit",
        "supersmash_too_easy",
        "supersmash_supremacy",
        "blitz_first_blood",
        "blitz_full_inventory",
        "supersmash_two_for_one",
        "skywars_max_perk",
        "skywars_legendary",
        "skywars_portal_game",
        "skywars_speed_runner",
        "skywars_trolol",
        "skywars_sniper",
        "truecombat_ender_dragon",
        "skywars_solo_warrior",
        "speeduhc_golden_apple",
        "speeduhc_melon_smasher",
        "speeduhc_enchanted_book",
        "speeduhc_enchanted_armor",
    ]

如您所见,achievementsOneTime 中有一个随机的[]。这是抛出错误:

解析值时遇到意外字符:[。

当试图在我的代码中反序列化它时:

    //Create the request
    var client = new RestClient("https://api.hypixel.net/");
    var request = new RestRequest($"player?key={_apiKey}&name={name}", Method.GET);

    //Get the response and Deserialize
    var response = client.Execute(request);
    var responseDeserialized = JsonConvert.DeserializeObject<GetPlayerData>(response.Content);

有什么方法可以忽略[],

抱歉,我不太确定该去哪里

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 可能不是随机的。它是一个空数组,在字符串之间看起来很奇怪,但从技术上讲它是有效的。 GetPlayerData 型号代码是什么?

标签: c# json


【解决方案1】:

首先您应该检查 API 响应是否有任何问题。在同一字段中混合类型并不常见(也不推荐)。

理想情况下,API 应该释放绑定到单一类型和定义语义的字段。

如果无法修复 API,则以下是选项

选项 1:

反序列化对象字段中的 achivementOneTime。根据值的类型,您可以执行不同的逻辑。如果您只想使用字符串值,请在使用前检查类型是否为字符串。

示例代码:

public class Program
{
    public static void Main()
    {
       string jsonData = "{ \"achievementsOneTime\": [ \"supersmash_tinman_challenge\", [], \"blitz_kill_without_kit\"] }";
       var responseDeserialized = JsonConvert.DeserializeObject<Achievements>(jsonData);
       Console.WriteLine("Deserialized response is ::");

       int index = 0;
       foreach (var item in responseDeserialized.achievementsOneTime)
       {
          PrintAchievementsOneTime(item, index);
          index++;
       }
     }

     private static void PrintAchievementsOneTime(Object achievementsOneTime, int index) {
         Console.WriteLine("Item at index " + index + " type is : " + achievementsOneTime.GetType().Name + ". Value is : " + achievementsOneTime);
    }
}

public class Achievements {
     public Object[] achievementsOneTime;
}

输出:

Deserialized response is ::
Item at index 0 type is : String. Value is : supersmash_tinman_challenge
Item at index 1 type is : JArray. Value is : []
Item at index 2 type is : String. Value is : blitz_kill_without_kit

选项 2

其他类似的选项是实现从JsonConverter 派生的AchievementsOneTimeConverter。 覆盖 ReadJson 方法以忽略 tpye 不是字符串的 JToken。 在成绩单上添加 JsonConverter 属性。

public class Achievements2 {
    [JsonConverter(typeof(AchievementsOneTimeConverter))]
    public List<string> achievementsOneTime;
}

public class AchievementsOneTimeConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(object[]);
    }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            List<string> result = new List<string>();
            foreach (JToken token in JArray.Load(reader).Children())
            {
                if (token.Type == JTokenType.String)
                {
                    result.Add(token.ToString());
                }
            }

            return result;
         }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

输出将只有字符串

Deserialized response is ::
Item at index 0 type is : String. Value is : supersmash_tinman_challenge
Item at index 1 type is : String. Value is : blitz_kill_without_kit

【讨论】:

    【解决方案2】:

    您应该避免混合类型。几乎可以肯定的是,GetPlayerData 中与“achievementsOneTime”对应的字段/属性是string[]List&lt;string&gt; 等。在这种情况下,[] 将无效。另外,我注意到数组以逗号结尾,这不会在 Newtonsoft 中中断,但在技术上这是无效的 JSON。

    我遇到了类似的错误:

    JsonConvert.DeserializeObject<string[]>("[\"1\", [], \"2\"]")
    

    错误:解析值时遇到意外字符:[。路径“[0]”,第 1 行,位置 7

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-09
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      相关资源
      最近更新 更多