在Json.Net c#中获取数据



我想正确地从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 1Another free titleUnordered title。当然,这些头衔会不断变化。然后,我想得到这些标题下的SubjectRelation数据。但我不知道怎么得到它。

此数据结构是_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>>,您可以对其进行迭代。然后,每个成员都将具有JTokenValue,在本例中为JArray,您可以将其强制转换为您类型的List

foreach (var groups in obj)
{
var infos = groups.Value.ToObject<List<_Info_>>();
// .. loop over infos
}

相关内容

  • 没有找到相关文章

最新更新