我想正确地从json文件中获取数据。我为此建模的json数据文件如下:
{
"Free title 1":[
{
"Subject": "a1",
"Relation": "a2"
},
{
"Subject": "b1",
"Relation": "b2"
}
],
"Another free title":[
{
"Subject": "z1",
"Relation": "z2"
},
{
"Subject": "y1",
"Relation": "y2"
}
],
"Unordered title":[
{
"Subject": "x1",
"Relation": "x2"
},
{
"Subject": "w1",
"Relation": "w2"
}
]
}
这就是我创建对象类的方式:
public class _Infos_
{
public List<_Info_> Infos { get; set; }
}
public class _Info_
{
public string Subject { get; set; }
public string Relation { get; set; }
}
最后,我试图用这样的方法获取数据:
var js = JsonConvert.DeserializeObject<_Infos_>(File.ReadAllText("__FILE_PATH__"));
foreach (var j in js.Infos)
{
MessageBox.Show(j.Subject);
}
我得到js
为空的错误。在这里,我想在列表中获得Free title 1
、Another free title
和Unordered title
。当然,这些头衔会不断变化。然后,我想得到这些标题下的Subject
和Relation
数据。但我不知道怎么得到它。
此数据结构是_Info_
s集合的字典。您需要将其反序列化为Dictionary<string, List<_Info_>>
。
以下是System.Text.Json和Json.net示例:
var d = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, List<_Info_>>>(json);
var d2 = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, List<_Info_>>>(json);
您的类定义有点错误。你可以使用在线工具"json到c#";以生成正确的类。比如这个:https://json2csharp.com
您的";根";的json中不包含数组。财产";自由标题1":[..]是一个数组,因此根需要一个名为FreeTitle1的属性,并且它必须是一个array/list。
public class Root
{
[JsonProperty("Free title 1")]
public List<TitleInfo> FreeTitle1 { get; set; }
[JsonProperty("Another free title")]
public List<TitleInfo> AnotherFreeTitle { get; set; }
[JsonProperty("Unordered title")]
public List<TitleInfo> UnorderedTitle { get; set; }
}
public class TitleInfo
{
public string Subject { get; set; }
public string Relation { get; set; }
}
如果对象成员具有动态名称,也可以手动反序列化对象,例如使用通用类型JObject
。例如
JObject obj = JObject.Parse(File.ReadAllText("__FILE_PATH__"));
JObject
实现了IEnumerable<KeyValuePair<string, JToken>>
,您可以对其进行迭代。然后,每个成员都将具有JToken
Value
,在本例中为JArray
,您可以将其强制转换为您类型的List
。
foreach (var groups in obj)
{
var infos = groups.Value.ToObject<List<_Info_>>();
// .. loop over infos
}