JSON.NET:从JProperty值获取JObject

10

我有一个问题:

我使用 JObject.Load 反序列化了一个 JSON 文件:

// get the JSON into an object 
JObject jsonObject = JObject.Load(new
  JsonTextReader(new StreamReader("mydoc.json")));

好的。我现在有一个已填充好的 jsonObject。
现在我这样遍历它的属性:
foreach (JProperty jsonRootProperty in jsonObject.Properties())
  {    
    if (jsonRootProperty.Name=="Hotel")
    {
      ... !!! I just want a JObject here...
    }
  }

当我找到一个名称等于“Hotel”的属性时,我希望该属性的值为JObject。但问题在于,Hotel属性名称可能是单个值(例如字符串),也可能是JSON对象或JSON数组。

我如何将属性的值传递给JObject变量,以便可以将其传递给另一个接受JObject参数的函数?

1个回答

16
获取 JPropertyValue,它是一个 JToken,并查看它的 Type。该属性将告诉您该令牌是否为对象、数组、字符串等。如果令牌类型为对象,则可以将其简单地强制转换为 JObject 并将其传递给您的函数。如果令牌类型不是对象且您的函数必须有一个 JObject,则需要将值包装在 JObject 中才能使其正常工作。
foreach (JProperty jsonRootProperty in jsonObject.Properties())
{    
    if (jsonRootProperty.Name=="Hotel")
    {
        JToken value = jsonRootProperty.Value;
        if (value.Type == JTokenType.Object)
        {
            FunctionThatAcceptsJObject((JObject)value);
        }
        else
        {
            FunctionThatAcceptsJObject(new JObject(new JProperty("value", value)));
        }
    }
}

(离题了,但我非常钦佩您,您对JSON.NET的知识以及愿意分享它的精神 - 感谢您的回复)。看起来不错,但您能否更详细地解释一下“将值包装在JObject中”?我浪费了很多时间来努力将JToken放入JObject中,显然我对JTokens和JObjects之间的关系缺少了一些东西... - Jazimov
这个答案的第一部分可能会对你有所帮助。它讲述了JToken、JObject等之间的关系。感谢你的好评。 - Brian Rogers
太棒了!那个链接看起来像是一个额外信息的宝库。加上你在这里的回答,应该能帮我克服JSON.NET的最后难关! - Jazimov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接