通过JSON中的JSON进行解析.NET具有未知属性名称
本文关键字:JSON 未知 属性 中的 通过 NET | 更新日期: 2023-09-27 17:58:03
我有一些JSON数据,看起来像这样:
{
"response":{
"_token":"StringValue",
"code":"OK",
"user":{
"userid":"2630944",
"firstname":"John",
"lastname":"Doe",
"reference":"999999999",
"guid":"StringValue",
"domainid":"99999",
"username":"jdoe",
"email":"jdoe@jdoe.edu",
"passwordquestion":"",
"flags":"0",
"lastlogindate":"2013-02-05T17:54:06.31Z",
"creationdate":"2011-04-15T14:40:07.22Z",
"version":"3753",
"data":{
"aliasname":{
"$value":"John Doe"
},
"smsaddress":{
"$value":"5555555555@messaging.sprintpcs.com"
},
"blti":{
"hideemail":"false",
"hidefullname":"false"
},
"notify":{
"grades":{
"$value":"0"
},
"messages":{
"$value":"1"
}
},
"beta_component_courseplanexpress_1":{
"$value":"true"
}
}
}
}
我使用的是带有JSON的C#。NET来解析数据。我已经能够使用以下算法成功地获取数据:
User MyUser = new User();
JToken data = JObject.Parse(json);
MyUser.FirstName = (string) data.SelectToken("response.user.firstname");
//The same for all the other properties.
问题出在data
字段上。此字段主要基于用户偏好,数据仅在使用时插入。这些字段都是自定义的,开发人员可以不受限制地输入任意数量的字段。本质上,它都是自由形式的数据。此外,正如您所注意到的,它们可以与数据嵌套得很远。
我试过运行:
MyUser.Data = JsonConvert.DeserializeObject<List<JToken>>((string) data.SelectToken("response.user.data");
这不起作用。
您将如何将其转换为用于C#对象?
您可以通过JToken
/JArray
/JObject
方法访问它。例如,这将列出数据下的所有密钥:
public class StackOverflow_14714085
{
const string JSON = @"{
""response"": {
""_token"": ""StringValue"",
""code"": ""OK"",
""user"": {
""userid"": ""2630944"",
""firstname"": ""John"",
""lastname"": ""Doe"",
""reference"": ""999999999"",
""guid"": ""StringValue"",
""domainid"": ""99999"",
""username"": ""jdoe"",
""email"": ""jdoe@jdoe.edu"",
""passwordquestion"": """",
""flags"": ""0"",
""lastlogindate"": ""2013-02-05T17:54:06.31Z"",
""creationdate"": ""2011-04-15T14:40:07.22Z"",
""version"": ""3753"",
""data"": {
""aliasname"": {
""$value"": ""John Doe""
},
""smsaddress"": {
""$value"": ""5555555555@messaging.sprintpcs.com""
},
""blti"": {
""hideemail"": ""false"",
""hidefullname"": ""false""
},
""notify"": {
""grades"": {
""$value"": ""0""
},
""messages"": {
""$value"": ""1""
}
},
""beta_component_courseplanexpress_1"": {
""$value"": ""true""
}
}
}
}
}";
public static void Test()
{
var jo = JObject.Parse(JSON);
var data = (JObject)jo["response"]["user"]["data"];
foreach (var item in data)
{
Console.WriteLine("{0}: {1}", item.Key, item.Value);
}
}
}
Json。NET实际上可以解析为动态,如果这对您有用的话。这意味着你可以做一些类似的事情。
dynamic parsedObject = JsonConvert.DeserializeObject("{ test: '"text-value'" }");
parsedObject["test"]; // "text-value"
parsedObject.test; // "text-value"
parsedObject.notHere; // null
编辑:如果你不知道自己在寻找什么,那么可能更适合迭代这些值。
dynamic parsedObject = JsonConvert.DeserializeObject("{ test: { inner: '"text-value'" } }");
foreach (dynamic entry in parsedObject)
{
string name = entry.Name; // "test"
dynamic value = entry.Value; // { inner: "text-value" }
}