Свойства есть - но на гораздо более низком уровне, чем ваш код, кажется, ожидать. Вы можете увидеть это следующим образом:
public static void TestJsonParse(string json)
{
try
{
var _mapping = JObject.Parse(json);
var _json = _mapping.ToString();
// _json == json at this poing other than some formating
var map = _mapping["c1-14.10.16"]["mappings"]["applog"]["properties"];
map.WritePropertiesToConsole();
Debug.Assert(map.Count() == 1); // No assert because the properties aren't here.
var subMap = _mapping["c1-14.10.16"]["mappings"]["applog"]["properties"]["error"]["properties"]["error"]["properties"]["data"]["properties"];
subMap.WritePropertiesToConsole();
Debug.Assert(subMap.Count() == 8); // no assert - the properties are all here.
Debug.Assert(_mapping["c1-14.10.16"]["mappings"]["applog"]["properties"]["error"]["properties"]["error"]["properties"]["data"]["properties"]["Microsoft.ServiceBus"]["index_analyzer"].ToString() == "standard"); // no assert
}
catch (Exception ex)
{
Debug.Assert(false, ex.ToString()); // No exception, no assert.
}
}
public static void WritePropertiesToConsole(this JToken subMap)
{
int iToken = 0;
Console.WriteLine(string.Format("Tokens for {0}: {1} found", subMap.Path, subMap.Count()));
foreach (JToken v in subMap)
{
string s = v.ToString();
Console.WriteLine(string.Format("Token {0}: {1}", iToken++, s));
}
}
А вот вывод на консоль:
Tokens for c1-14.10.16.mappings.applog.properties: 1 found
Token 0: "error": {
"properties": {
"error": {
"properties": {
"data": {
"properties": {
"DisablePrepareForRethrow": {
"type": "string",
"index_analyzer": "standard"
},
"HelpLink.BaseHelpUrl": {
"type": "string",
"index_analyzer": "standard"
},
"HelpLink.EvtID": {
"type": "string",
"index_analyzer": "standard"
},
"HelpLink.EvtSrc": {
"type": "string",
"index_analyzer": "standard"
},
"HelpLink.LinkId": {
"type": "string",
"index_analyzer": "standard"
},
"HelpLink.ProdName": {
"type": "string",
"index_analyzer": "standard"
},
"Microsoft.ServiceBus": {
"type": "string",
"index_analyzer": "standard"
},
"length": {
"type": "integer"
}
}
}
}
}
}
}
Tokens for c1-14.10.16.mappings.applog.properties.error.properties.error.properties.data.properties: 8 found
Token 0: "DisablePrepareForRethrow": {
"type": "string",
"index_analyzer": "standard"
}
Token 1: "HelpLink.BaseHelpUrl": {
"type": "string",
"index_analyzer": "standard"
}
Token 2: "HelpLink.EvtID": {
"type": "string",
"index_analyzer": "standard"
}
Token 3: "HelpLink.EvtSrc": {
"type": "string",
"index_analyzer": "standard"
}
Token 4: "HelpLink.LinkId": {
"type": "string",
"index_analyzer": "standard"
}
Token 5: "HelpLink.ProdName": {
"type": "string",
"index_analyzer": "standard"
}
Token 6: "Microsoft.ServiceBus": {
"type": "string",
"index_analyzer": "standard"
}
Token 7: "length": {
"type": "integer"
}
свойства есть, точно в глубине, указанной в строке JSON, представленной в этом вопросе. Поэтому JSON.net не снимает ничего с предоставленного примера. Вы можете увидеть иерархию явно с помощью http://jsonformatter.curiousconcept.com/:
Если вы измените описание проблемы, чтобы выглядеть следующим образом: «приведены некоторые JSON, как я могу рекурсивно найти ребенка свойство с именем„свойства“с более чем один ребенок собственности», вы можете сделать это так, адаптировано из here:
static IEnumerable<JToken> FindProperties(JToken root)
{
return root.WalkNodes().Where(n =>
{
var _parent = n.Parent as JProperty;
if (_parent != null && _parent.Name == "properties")
{
if (n.Count() > 1)
return true;
}
return false;
});
}
public static IEnumerable<JToken> WalkNodes(this JToken node)
{
if (node.Type == JTokenType.Object)
{
yield return (JObject)node;
foreach (JProperty child in node.Children<JProperty>())
{
foreach (var childNode in child.Value.WalkNodes())
yield return childNode;
}
}
else if (node.Type == JTokenType.Array)
{
foreach (JToken child in node.Children())
{
foreach (var childNode in child.WalkNodes())
yield return childNode;
}
}
}
, а затем, чтобы проверить:
var _properties = FindProperties(_mapping);
var list = _properties.ToArray();
Debug.Assert(list.Length == 1 && list[0] == subMap); // no assert
сек orry, если у json опубликовано дополнительное закрытие, я опубликовал только фрагмент, содержащий оскорбительный узел и его происхождение, поскольку оригинал очень большой. Однако это не проблема. Однако я отредактирую сообщение с исправленным json. – danatcofo
@ danatcofo, это не только закрывающая скобка :) Смотрите изображение. –
yah, на самом деле это узел, который я пропустил в своем редактировании. Однако моя точка зрения остается. – danatcofo