Esta es la solución más válida que te podemos aportar, pero primero mírala detenidamente y valora si se puede adaptar a tu trabajo.
Solución:
Realmente no necesitas preocuparte por JContainer
en la mayoría de los casos. Está ahí para ayudar a organizar y estructurar LINQ-to-JSON en un código bien factorizado.
los JToken
la jerarquía se ve así:
JToken - abstract base class
JContainer - abstract base class of JTokens that can contain other JTokens
JArray - represents a JSON array (contains an ordered list of JTokens)
JObject - represents a JSON object (contains a collection of JProperties)
JProperty - represents a JSON property (a name/JToken pair inside a JObject)
JValue - represents a primitive JSON value (string, number, boolean, null)
Así que ya ves, un JObject
es a JContainer
cual es a JToken
.
Esta es la regla general básica:
- Si sabe que tiene un objeto (indicado por llaves
y
en JSON), utilice
JObject
- Si sabes que tienes un array o lista (indicada por corchetes
[
and]
), usarJArray
- Si sabe que tiene un valor primitivo, use
JValue
- Si no sabe qué tipo de token tiene, o desea poder manejar cualquiera de los anteriores de manera general, use
JToken
. A continuación, puede comprobar suType
property para determinar qué tipo de token es y lanzarlo apropiadamente.
JContainer
es una clase base para elementos JSON que tienen elementos secundarios. JObject
, JArray
, JProperty
y JConstructor
todos heredan de ella.
Por ejemplo, el siguiente código:
(JObject)JsonConvert.DeserializeObject("[1, 2, 3]")
lanzaría un InvalidCastException
pero si lo lanzas a un JContainer
estaría bien.
Con respecto a su pregunta original, si sabe que tiene un objeto JSON en el nivel superior, puede usar:
var jsonWork = JObject.Parse(json);
var jsonObject1 = jsonWork["Object1"];
Si para ti ha sido de ayuda nuestro post, sería de mucha ayuda si lo compartieras con otros programadores y nos ayudes a extender nuestra información.