解析Json返回字符串或字符串数组?

爆破

我可以使用泛型将这些代码转换为一种方法吗?

我想返回字符串或字符串数​​组,因为我的Json文件如下所示。

杰森样本

所以我想这样做。

public static string langFilePath = @"..\..\..\Core\Data\Lang.json";
public static JObject lang = JObject.Parse(File.ReadAllText(langFilePath));

public static string[] GetJsonValue(string key)
{
    string[] values = lang[key].ToObject<string[]>();

    return values;
}

但是键的值不能是字符串数组。

它也可以是字符串。

聚苯乙烯

而不是返回两种可能的返回类型之一,将一个字符串强制转换为包含该字符串的数组可能更简单。假设您不控制Json,则可能要编写一个custom JsonConverter这是我快速解决问题的方法:

public class LangEntryConverter: JsonConverter<string[]>
{
    // WriteJson implementation only needed if you need to serialize a value back to Json
    public override void WriteJson(JsonWriter writer, string[] value, JsonSerializer serializer)
    {
        if (value.Length == 1)
        {
            writer.WriteValue(value[0]);
        }
        else
        {
            writer.WriteStartArray();
            for (var i = 0; i < value.Length; i++)
            {
                writer.WriteValue(value[i]);
            }
            writer.WriteEndArray();
        }
    }

    public override string[] ReadJson(JsonReader reader, Type objectType, string[] existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var values = new List<string>();
        if (reader.TokenType == JsonToken.StartArray)
        {
            while (reader.Read() && reader.TokenType != JsonToken.EndArray)
            {
                if (reader.TokenType == JsonToken.String)
                {
                    values.Add((string)reader.Value);
                }
                else
                {
                    throw new Exception($"Unexpected token type: {reader.TokenType}");
                }
            }
        }
        else if (reader.TokenType == JsonToken.String)
        {
            values.Add((string)reader.Value);
        }

        return values.ToArray();
    }
}

然后这样称呼它:

// Note: double-quotations are required for C#'s verbatim string syntax; they are not part of the Json
var json = @"{
  ""foo"": ""one"",
  ""bar"": [""one"", ""two"", ""three""]
}";

var lang = JsonConvert.DeserializeObject<Dictionary<string, string[]>>(json, new LangEntryConverter());
Console.WriteLine(String.Join(", ", lang["foo"]));  // one
Console.WriteLine(String.Join(", ", lang["bar"]));  // one, two, three

当然,在您的特定情况下,这可能需要进行一些调整。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章