Преобразование и синтаксический анализ строки json в пары ключ-значение с помощью NewtonSoft - PullRequest
2 голосов
/ 28 мая 2020

Попытка преобразовать строку json в пары значений ключа с помощью Newtonsoft, но пока безуспешно.

Ответ от API:

var response = @"{'result':{'0199 - B344EE33':
{
     '6400_00260100':{'1':[{'val':336688}]},
     '6400_00462500':{'1':[{'val':null}]},
     '6800_00832A00':{'1':[{'low':3000,'high':3000,'val':3000}]},
     '6800_008AA200':{'1':[{'low':0,'high':null,'val':0}]}
}}}";

Результат, который я хочу, - это новый объект пар ключ-значение:

{
    "6400_00260100" : 336688,
    "6400_00462500" : null,
    "6800_00832A00" : 3000,
    "6800_008AA200" : 0
}

В ответе result всегда будет первой и единственной опорой. На следующем уровне код 0199 - B344EE33 может измениться, но на этом уровне будет только одна опора, поэтому мы всегда можем выбрать первую. Затем на последнем уровне нам всегда нужно свойство val.

У меня есть следующее, но для получения пар ключ-значение в чистом виде я застрял:

var json = JObject.Parse(response);
var result = json["result"].First;
var path = result.Path;

ОБНОВЛЕНИЕ

        var jObjectResult = new JObject();

        var response = @"{'result':{'0199 - B344EE33':
                        {
                            '6800_10821E00':{'1':[{'val':'SMA Sunny Boy'}]},
                            '6800_00A21E00':{'1':[{'val':'3.0.0.2222'}]},
                            '6800_00823400':{'1':[{'low':3000,'high':3000,'val':3000}]},
                            '6800_08822B00':{'1':[{'val':'SMA'}]},
                            '6800_08822000':{'1':[{'val':'Sunny Boy 3.0'}]}
                        }}}";

        var json = JObject.Parse(response);
        var json_serial = json["result"].First.Children<JObject>().ToList()[0];

        foreach(var token in json_serial)
        {
            var tokenKey = token.Key;
            var tokenVal = token.Value.SelectToken("$.1[0].val");

            jObjectResult.Add(tokenKey, tokenVal);
        }

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

В конце с некоторыми указателями от @Brian Rogers я пришел со следующим решением:

    // Arrange
    var response = @"{'result':{'0199 - B344EE33':
                    {
                        '6800_10821E00':{'1':[{'val':'SMA Sunny Boy'}]},
                        '6800_00A21E00':{'1':[{'val':'3.0.0.2222'}]},
                        '6800_00823400':{'1':[{'low':3000,'high':3000,'val':3000}]},
                        '6800_08822B00':{'1':[{'val':'SMA'}]},
                        '6800_08822000':{'1':[{'val':'Sunny Boy 3.0'}]}
                    }}}";

    // Act
    var json = JObject.Parse(response);
    var json_serial = (JProperty)json["result"].First();
    var jObjectResult = new JObject(
        json_serial.Value.Select(p =>
        {
            return new JProperty(
                ((JProperty)p).Name,
                p.First.SelectToken("$.1[0].val")
            );
        }));
0 голосов
/ 28 мая 2020

Вы можете использовать SelectTokens с оператором рекурсивного спуска .., чтобы найти все свойства val, а затем пройти по цепочке, используя .Parent несколько раз, чтобы получить соответствующий ключ. Создайте новый JProperties из этой информации и поместите их в новый JObject, чтобы получить свой результат. Вот "однострочный":

var result = new JObject(
    JObject.Parse(response)
           .SelectTokens("$..val")
           .Select(jt => new JProperty(
               ((JProperty)jt.Parent.Parent.Parent.Parent.Parent.Parent).Name,
               jt
           ))
);

Fiddle: https://dotnetfiddle.net/TbZ7LS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...