Невозможно проверить элементы и значение из строки json, загруженной в JsonElement с помощью jsonElement.TryGetProperty - PullRequest
0 голосов
/ 03 февраля 2020

Я использую. net core 3.1 и System.Text. Json. У меня есть строка в подэлементе json с утверждениями об элементах, которые я хотел загрузить в некоторый элемент. net, а затем проверить ключи в нем

{
  "scope": "openid MyScop",
  "claims": "{\"premiuminfo\":{\"country\":{\"value\":\"country1\"},\"town\":{\"value\":\"town1\"},\"given_name\":{\"value\":\"given_name1\"},\"postal_code\":{\"value\":\"postal_code1\"},\"family_name\":{\"value\":\"family_name1\"},\"houseno_or_housename\":{\"value\":\"test house number\"}}}",  
}

Я могу загрузить объект претензий в JsonElement

 JsonElement o = JsonSerializer.Deserialize<JsonElement>(s);

Но не может найти какой-либо способ проверить такие ключи, как premiuminfo, county et c.

Может кто-нибудь помочь мне в его использовании

Ответы [ 3 ]

2 голосов
/ 03 февраля 2020

Возможно, вы ищете TryGetProperty

TryGetProperty (ReadOnlySpan, JsonElement)

Ищет свойство с именем propertyName в текущем объекте, возвращая значение это указывает, существует ли такое свойство. Когда свойство существует, метод присваивает его значение аргументу значения.

0 голосов
/ 03 февраля 2020

Неправильно использовали TryGetProperty. Вот как я смог проверить

string s = "{\"premiuminfo\":{\"country\":{\"value\":\"country1\"},\"town\":{\"value\":\"town1\"},\"given_name\":{\"value\":\"given_name1\"},\"postal_code\":{\"value\":\"postal_code1\"},\"family_name\":{\"value\":\"family_name1\"},\"houseno_or_housename\":{\"value\":\"houseno_or_housename1\"}}}";
//s = jwtData.ContainsKey("claims");
try
{
    JsonElement o = JsonSerializer.Deserialize<JsonElement>(s);

    if (o.TryGetProperty("premiuminfo", out var premiuminfo))
    {
        if (!premiuminfo.TryGetProperty("name", out var _) && (!premiuminfo.TryGetProperty("given_name", out var _) || !premiuminfo.TryGetProperty("family_name", out var _)))
        {
            processingResult = new ProcessingResultObject { ErrorResult = new ErrorResult { error = ErrorTypes.invalid_request.ToString(), error_description = "name or given_name, family_name is missing in claims" }, StatusCode = 400 };
        }
        else if (premiuminfo.TryGetProperty("name", out var _) && (premiuminfo.TryGetProperty("given_name", out var _) || !premiuminfo.TryGetProperty("family_name", out var _)))
        {
            processingResult = new ProcessingResultObject { ErrorResult = new ErrorResult { error = ErrorTypes.invalid_request.ToString(), error_description = "name and (given_name, family_name) both exists in claims" }, StatusCode = 400 };
        }
        else if (!premiuminfo.TryGetProperty("address", out var _) && (!premiuminfo.TryGetProperty("houseno_or_housename", out var _) || !premiuminfo.TryGetProperty("postal_code", out var _)))
        {
            processingResult = new ProcessingResultObject { ErrorResult = new ErrorResult { error = ErrorTypes.invalid_request.ToString(), error_description = "address is missing in claims" }, StatusCode = 400 };
        }
        else if (premiuminfo.TryGetProperty("address", out var _) && (premiuminfo.TryGetProperty("houseno_or_housename", out var _) || premiuminfo.TryGetProperty("postal_code", out var _)))
        {
            processingResult = new ProcessingResultObject { ErrorResult = new ErrorResult { error = ErrorTypes.invalid_request.ToString(), error_description = "address and (houseno_or_housename, postal_code) both exists in claims" }, StatusCode = 400 };
        }
        else
        {
            processingResult.Result = true;
        }
    }
    else
    {
        processingResult = new ProcessingResultObject { ErrorResult = new ErrorResult { error = ErrorTypes.invalid_request.ToString(), error_description = "premiuminfo are not found in claims" }, StatusCode = 400 };
    }
}
catch (Exception ex)
{
    processingResult = new ProcessingResultObject { ErrorResult = new ErrorResult { error = ErrorTypes.invalid_request.ToString(), error_description = "premiuminfo are not found in claims. ex" }, StatusCode = 400 };
}
0 голосов
/ 03 февраля 2020

Я бы порекомендовал использовать библиотеку Newtonsoft. Json, которая дает вам больше функциональности. Вы можете проанализировать ваш основной json и затем строковый объект, который у вас есть для утверждений, а также получить доступ к свойствам в утверждениях.

пример

var obj = JObject.Parse(json);
var claims = JObject.Parse(obj["claims"].ToString());

Console.WriteLine(claims["premiuminfo"].ToString()); // Prints entire claim
Console.WriteLine(claims["premiuminfo"]["country"].ToString()); // prints the country.

...