Невозможно проверить элементы и значение из строки json, загруженной в JsonElement с помощью jsonElement.TryGetProperty

Я использую .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 и т. Д.

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


person Kamran Shahid    schedule 03.02.2020    source источник


Ответы (3)


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

TryGetProperty (ReadOnlySpan, JsonElement)

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

person Liquid Core    schedule 03.02.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 };
}
person Kamran Shahid    schedule 03.02.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.

person Jawad    schedule 03.02.2020