Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析Json以返回字符串或字符串数组?_C#_Json_Json.net - Fatal编程技术网

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

C# 解析Json以返回字符串或字符串数组?,c#,json,json.net,C#,Json,Json.net,我可以用泛型将这些代码转换成一个方法吗 我想要返回字符串或字符串数组,因为我的Json文件如下所示 所以我想这样做 public static string langFilePath = @"..\..\..\Core\Data\Lang.json"; public static JObject lang = JObject.Parse(File.ReadAllText(langFilePath)); public static string[] GetJsonValue(string ke

我可以用泛型将这些代码转换成一个方法吗

我想要返回字符串或字符串数组,因为我的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;
}
公共静态字符串langFilePath=@“.\..\\..\Core\Data\Lang.json”;
公共静态JObject lang=JObject.Parse(File.ReadAllText(langFilePath));
公共静态字符串[]GetJsonValue(字符串键)
{
string[]values=lang[key].ToObject();
返回值;
}
但键的值不能是字符串数组


它也可以是字符串。

与其返回两种可能的返回类型中的一种,还不如将单个字符串强制到包含该字符串的数组中。假设您不控制Json,那么您可能需要编写一个自定义代码。下面是我对这个问题的快速而肮脏的尝试:

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();
    }
}
public类LangEntryConverter:JsonConverter
{
//只有在需要将值序列化回Json时才需要WriteJson实现
公共重写void WriteJson(JsonWriter编写器,字符串[]值,JsonSerializer序列化程序)
{
如果(value.Length==1)
{
writer.WriteValue(值[0]);
}
其他的
{
writer.writestarray();
对于(变量i=0;i
然后这样称呼它:

// 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
//注意:C#的逐字字符串语法需要双引号;它们不是Json的一部分
var json=@”{
“foo”:“one”,
酒吧:[“一”、“二”、“三”]
}";
var lang=JsonConvert.DeserializeObject(json,new LangEntryConverter());
Console.WriteLine(String.Join(“,”,lang[“foo”]);//一
Console.WriteLine(String.Join(“,”,lang[“bar]”));//一,二,三
当然,在您的特定情况下,这可能需要一些调整。

使用通用语法:

 class Program<T>
{

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

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

        return values;
    }
}
类程序
{
公共静态字符串langFilePath=@“.\..\..\Core\Data\Lang.json”;
公共静态JObject lang=JObject.Parse(File.ReadAllText(langFilePath));
公共静态T GetJsonValue(字符串键)
{
T values=lang[key].ToObject();
返回值;
}
}

这两种方法看起来完全不同,为什么要在这里使用泛型?还有,这些方法的意义是什么,你扔掉了
a
的值吗?对不起,我是C#新手。有没有不使用它的方法呢?你似乎没有使用“a”参数。为什么不让你的函数每次都返回一个数组呢?会让事情变得不那么复杂。只有一个成员的数组并不是世界末日。是的,谢谢大家的回答:D@Stefan同意,在我看到所有评论之前,我就开始把它放在一起(实际上只是为了刷新自己,因为我已经至少一年没有深入使用Json.NET了)。我决定把这个放在这里,以防对未来的读者有所帮助。嗯,我认为泛型参数放错了地方。您可以在
程序中找到它,但它应该在
GetJsonValue
上。此外,显示调用语法(即如何调用
GetJsonValue
来获取字符串与字符串数组)可能会有所帮助。你可以把你的问题和代码放在那里,这样别人就更容易跟上;-)Ps:我也认为应该是
GetJsonValue
而不是
Program