Самый краткий способ разбора JSON с JSON. NET, без - PullRequest
1 голос
/ 09 января 2020

Допустим, у меня есть это JSON:

{
  "top.level": {
    "mykey": "3.301.0.97",
    "mykey2": "not interested in this one"
  },
  "another.top.level": "not interested in this either"
}

Я собираюсь использовать Json. NET для анализа этой строки и получения значения "mykey".

У меня есть два вопроса:

  1. Как мне это сделать без строгого набора текста C#, при этом изящно обрабатывая сценарий ios, где JSON не имеет top.level или mykey? Я не хочу заканчивать тем, что бросил NullReferenceExceptions или подобное. Есть ли более элегантный ответ, чем приведенный ниже?
string answer;
var jsonObj = JObject.Parse(jsonString);

if (jsonObj != null)
{
   var topElement = jsonObj["top.level"];
   if (topElement != null)
   {
      var keyElement = topElement["mykey"];
      if (keyElement != null)
      {
         answer = keyElement.Value<string>();
      }
    }
}
Допустим, я делаю хочу использовать строгую типизацию. Как мне это сделать, учитывая наличие периода в top.level? Какое определение типа я бы создал, учитывая, что я игнорирую mykey2 и another.top.level?

Я также готов выполнять обе эти вещи без использования Json. NET, используя любой из встроенных механизмов сериализации. NET, так что все идеи и предложения приветствуются. Спасибо!

1 Ответ

3 голосов
/ 09 января 2020

Вы можете использовать нулевое распространение, чтобы сделать ваш код более читабельным. Например, следующий код может заменить ваш пример:

var answer = jsonObj?["top.level"]?.Value<string>("myKey");

Для вашего второго вопроса вы можете использовать атрибут JsonProperty, чтобы определить пользовательское имя для свойства. Это может представлять ваш пример:

public class Level2 { public string MyKey { get; set; } }
public class Level1
{
    [JsonProperty("top.level")]
    public Level2 TopLevel { get; set; }
}

Теперь вы можете десериализовать с помощью этого кода:

var strongType = JsonConvert.DeserializeObject<Level1>(str);
var answer = strongType?.TopLevel?.MyKey;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...