将 JObject 和 JProperty 与 JSON.Net 4.0 结合使用

本文关键字:结合 Net JSON JObject JProperty | 更新日期: 2023-09-27 18:33:44

我正在尝试以这种格式反序列化 JSON:

{
   "data": [
      {
         "installed": 1,
         "user_likes": 1,
         "user_education_history": 1,
         "friends_education_history": 1,
         "bookmarked": 1
      }
   ]
}

到一个简单的字符串数组,如下所示:

{
    "installed",
    "user_likes",
    "user_education_history",
    "friends_education_history",
    "bookmarked"
}

使用JSON.NET 4.0

我已经让它使用"自定义创建转换器"工作

public class ListConverter : CustomCreationConverter<List<string>>
{
public override List<string> Create(Type objectType)
{
    return new List<string>();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    var lst = new List<string>();
    //don't care about the inital 'data' element
    reader.Read();
    while (reader.Read())
    {
        if (reader.TokenType == JsonToken.PropertyName)
        {
            lst.Add(reader.Value.ToString());
        }
    }
    return lst;
}
}

但这似乎真的有点矫枉过正,特别是如果我想为许多不同的 JSON 响应创建一个。

我试过使用JObject但似乎我做得不对:

List<string> lst = new List<string>();
JObject j = JObject.Parse(json_string);
foreach (JProperty p in j.SelectToken("data").Children().Children())
{
    lst.Add(p.Name);
}

有没有更好的方法可以做到这一点?

将 JObject 和 JProperty 与 JSON.Net 4.0 结合使用

有很多方法可以做到这一点,而且你所拥有的很好。其他一些替代方案如下所示:

  • 获取数组的第一个元素,而不是所有子元素
  • 使用 SelectToken 通过单个调用转到第一个数组元素

        string json = @"{
          ""data"": [
            {
              ""installed"": 1,
              ""user_likes"": 1,
              ""user_education_history"": 1,
              ""friends_education_history"": 1,
              ""bookmarked"": 1
            }
          ]
        }";
        JObject j = JObject.Parse(json);
        // Directly traversing the graph
        var lst = j["data"][0].Select(jp => ((JProperty)jp).Name).ToList();
        Console.WriteLine(string.Join("--", lst));
        // Using SelectToken
        lst = j.SelectToken("data[0]").Children<JProperty>().Select(p => p.Name).ToList();
        Console.WriteLine(string.Join("--", lst));
    

您也可以使用此解决方案来获取键和值:

string key, value;
var propertyList = (JObject)j["data"];
foreach (var property in propertyList)
{
   key = property.Key;
   value = property.Value.ToString();
}