Ashish Kosti Ответов: 3

У меня есть ответ JSON, и я хочу получить значение элемента и позиции динамически.


Hi

I have JSON response and I want to get the Item and Position values. Where is it in the tree structure I want the Item and Position. In C# WPF
"address": [
    {
      "item": {
        "country": "USA",
        "locality": "Rio Rancho",
        "postal_code": "87124",
        "region": "New Mexico",
        "street": "1380 Rio Rancho Blvd SE #363",
        "type": [
          "work"
        ]
      },
      "position": "168,124,399,124,399,169,168,169"
    }
  ],
  "comment": [
    {
      "item": "CELL",
      "position": "554,277,596,277,596,291,554,291"
    }
  ],
  "email": [
    {
      "item": "aynejames@me.com",
      "position": "532,114,746,114,746,139,532,139"
    }
  ],
  "formatted_name": [
    {
      "item": "Wayne Stansfield. CLCS",
      "position": "55,178,399,178,399,208,55,208"
    }
  ],
  "label": [
    {
      "item": {
        "address": "1380 Rio Rancho Blvd SE #363 Rio Rancho, NM 87124, 87124",
        "type": [
          "work"
        ]
      },
      "position": "168,124,399,124,399,169,168,169"
    }
  ],

"name": [
    {
      "item": {
        "family_name": "CLCS",
        "given_name": "Wayne Stansfield."
      },
      "position": "0,0,0,0,0,0,0,0"
    }
  ],
  "organization": [
    {
      "item": {
        "name": "Luarris Insurance"
      },
      "position": "54,300,400,300,400,351,54,351"
    },
    {
      "item": {
        "name": "A Legacy Of Qu(zlity Service '"
      },
      "position": "124,271,393,271,393,294,124,294"
    }
  ],
If there are two Items like in Organization tab it should return both Item1,2 and Position1,2 .

It is completely dynamic Address, Name, Email which are the starting Key values of the JSON response those also be may or may not there. And if there is any new key then the Item and Position value of that new key should also be returned.

Can anyone help me out from this problem?


Что я уже пробовал:

Я пытался сделать его динамичным, но то, что я получаю, это только статический метод.

Пожалуйста, помогите мне решить эту проблему.

3 Ответов

Рейтинг:
2

Ashish Kosti

Спасибо вам обоим за ценные ответы.
Вот мой способ, что я сделал, чтобы исправить это.

Поскольку меня интересует пункт и положение каждого блока.


string txtValue = "";
string positionValue = "";
foreach (dynamic property in json.Properties())
{
    if (property.Value.HasValues)
    {
        for (int j = 0; j < property.Value.Count; j++)
        {
            foreach (JProperty data in property.Value[j])
            {
                if (data.Name == "item")
                {
                    foreach (dynamic item in property.Value[j])
                    {
                        if (data.Name == "item" && item.Name != "position")
                        {
                            if (item.Value.HasValues)
                            {
                                foreach (JProperty itemvalue in item.Value)
                                {
                                    if (itemvalue.Name != "type")
                                    {
                                        txtValue = txtValue + itemvalue.Value.ToString().Replace("\"", "") + " ";
                                    }
                                }
                            }
                            else
                            {
                                txtValue = item.Value.ToString().Replace("\"", "");
                            }
                            Console.WriteLine(txtValue);
                        }
                        else if (item.Name == "position")
                        {
                            positionValue = item.Value.ToString().Replace("\"", "");
                            Console.WriteLine(positionValue);
                        }
                    }
                    int[] positions = new int[8];
                    string[] newMatch = positionValue.Split(',');
                    for (int i = 0; i < newMatch.Length; i++)
                    {
                        positions[i] = Convert.ToInt32(newMatch[i]);
                    }
                    drawRectangleOverWord(positions, txtValue);
                }
            }
            txtValue = "";
            positionValue = "";
        }
    }
}



Этот код работает для меня в txtvalue я получил элемент, а в positionvalue я получил позицию.

Спасибо
Ашиш


Рейтинг:
1

Graeme_Grant

Я написал статью для таких вопросов, как этот: Работа с JSON в C# и VB[^] ... Он ответит на все ваши вопросы о десериализации JSON


Рейтинг:
1

raddevus

Это большая капля JSON. Я прогнал его через json linter (JSONLint - валидатор JSON[^]) и это не является действительным, так что это делает его более трудным, чтобы дать вам быстрый ответ.

Итак, я ухватился только за первую его часть, чтобы подвести вас к решению:

[{
 	"item": {
 		"country": "USA",
 		"locality": "Rio Rancho",
 		"postal_code": "87124",
 		"region": "New Mexico",
 		"street": "1380 Rio Rancho Blvd SE #363",
 		"type": [
 			"work"
 		]
 	},
 	"position": "168,124,399,124,399,169,168,169"
 }]


Вы можете понять это сами, если сделаете следующее:
1) откройте инструменты разработки браузера (обычно F12)
2) скопируйте json выше.
3) введите следующее в командной консоли dev tools:
var address =  [{
 	"item": {
 		"country": "USA",
 		"locality": "Rio Rancho",
 		"postal_code": "87124",
 		"region": "New Mexico",
 		"street": "1380 Rio Rancho Blvd SE #363",
 		"type": [
 			"work"
 		]
 	},
 	"position": "168,124,399,124,399,169,168,169"
 }]


Очевидно вы печатаете
var address =

а затем вставьте в json и нажмите <enter>

Теперь вы можете изучить объект адреса самостоятельно.

В консоли разработчика введите следующее и нажмите <enter>

address[0].item.country


Когда вы это сделаете, консоль отобразит: США
Вот снимок того, как он выглядит, запущенный в нижней части этой страницы (CP), пока я печатаю этот ответ.
https://i.stack.imgur.com/ItMXd.png[^]

Теперь вы можете исправить свой JSON, установить свой объект и попробовать его самостоятельно.