1

我有一些有效的 JSON,但看起来有点古怪。这里是:

{
"server":"some server name",
"files":
{
"filename1":{"source":"original","format":"text"},
"filename2":{"source":"original","format":"text"},
"filename3":{"source":"original","format":"text"}
}
}

如您所见,“文件”部分每个“文件”包含一个 JSON 对象,因此我可以将其作为 JToken 数组获取,但不确定如何获取“文件名 1”、“文件名 2”等的值。

我正在使用 JSON.NET 和 C#,所以请不要提供需要 System.Web.Extensions.dll 中的 JavaScriptSerializer 的答案。纯 JObject/JToken 调用或 JConvert.DeserializeObject<> 都可以。

谢谢。

4

3 回答 3

2

尝试这个

public class Data
{
    public Data()
    {
        Files = new Dictionary<string, FileData>();
    }
    public string Server { get; set; }
    public IDictionary<string, FileData> Files { get; set; } 
}
public class FileData
{
    public string Source { get; set; }
    public string Format { get; set; }
}

然后使用它访问它

var result = JsonConvert.DeserializeObject<Data>(JsonValue);
于 2013-02-05T20:22:07.923 回答
2

使用动态反序列化怎么样?请参阅使用 Json.net 将 json 对象反序列化为动态对象

string json = @"{""server"":""some server name"",""files"":{""filename1"":{""source"":""original"",""format"":""text""},""filename2"":{""source"":""original"",""format"":""text""},""filename3"":{""source"":""original"",""format"":""text""}}}";
dynamic result = JObject.Parse(json);

Console.WriteLine(result.server);
foreach (dynamic file in result.files)
{
    Console.WriteLine(file.Name);
    dynamic value = file.Value;
    Console.WriteLine(value.source);
    Console.WriteLine(value.format);
}

输出

some server name
filename1
original
text
filename2
original
text
filename3
original
text
于 2013-02-05T20:28:34.150 回答
1

您必须像这样定义一个类:

class ClassName
{
    public string server;
    public ClassName2 files;
}

并定义 ClassName2:

class ClassName2
{
    ClassName3 filename1;
    ClassName3 filename2;
    ClassName3 filename3;
}

最后是 ClassName3

ClassName3
{
    public string source;
    public string format;
}

支持您已将 json 数据保存在字符串变量中,例如“结果”

 ClassName fin = JsonConvert.DeserializeObject<ClassName>(result);

这将为您提供所需的任何东西。

于 2013-02-05T20:10:53.743 回答