читать конкретные данные из массива JSON - PullRequest
0 голосов
/ 21 октября 2019

У меня есть такая таблица json, как я могу пытаться получить конкретные данные?

var json_str={ "table1":[
{"name1":"data1"},
{"name2":"data2"},
{"name3":"data3"}
],
"table2":[
{"name1":"data1"},
{"name2":"data2"},
{"name3":"data3"}
]
}   
dynamic stuff = JsonConvert.DeserializeObject(json_string); 

//I'd like attempt to data like this(for example)

var abc=stuff.table1["name1"];

это, очевидно, неправильно, но есть ли какой-нибудь метод для вызова содержимого таблицы json по имени?

РЕШЕНО: Я изменил свой JSON на

var json_str={ "table1":{
"name1":"data1",
"name2":"data2",
"name3":"data3"
},
"table2":{
"name1":"data1",
"name2":"data2",
"name3":"data3"
}
} 

var abc=JsonConvert.DeserializeObject<Form1.RootObject>(json_str);  

, и теперь у меня есть попытка (например): abc.table1.name2;

Большое спасибоxdtTransform и все за подсказки.

Ответы [ 3 ]

0 голосов
/ 21 октября 2019

Почему бы не десериализовать ваш Json для строго типизированных объектов, как показано в следующем примере

 class Program
    {
        static void Main(string[] args)
        {
            var json_str = "{ table1:[{name:'data1'}," +
                "{name:'data2'},{name:'data3'}]," +
                "table2:[{name:'data1'},{name:'data2'},{name:'data3'}]}";

            var collection = JsonConvert.DeserializeObject<TableCollectionObject>(json_str);

            foreach (var item in collection.table1)
            {
                Console.WriteLine(item.name);
            }

            foreach (var item in collection.table2)
            {
                Console.WriteLine(item.name);
            }

            Console.ReadLine();

        }
    }

    class TableCollectionObject
    {
        public ICollection<SingleTableObject> table1 { get; set; }
        public ICollection<SingleTableObject> table2 { get; set; }
    }

    class SingleTableObject
    {
        public string name { get; set; }
    }

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

0 голосов
/ 21 октября 2019

A. JObject.Parse

JObject o = JObject.Parse(json);

var name = o["table1"][0]["name1"].Value<string>();// data1
var name2 = o["table2"][2]["name3"].Value<string>();// data3

B. Dicstionary, List, Dictionary

var d = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string,List<Dictionary<string,string>>>>(json);

var nameB = d["table1"][0]["name1"]; // data1
var nameB2 = d["table2"][2]["name3"]; // data3

Это тестовые данные, которые я использовал.

var json = @"{ ""table1"":[
{""name1"":""data1""},
{""name2"":""data2""},
{""name3"":""data3""}
],
""table2"":[
{""name1"":""data1""},
{""name2"":""data2""},
{""name3"":""data3""}
]
}";

Это обычная структура данных, потому что 1-й элементв массивах есть одно свойство с именем name1, а у 2-го элемента есть одно свойство с именем name2.

Более распространенная схема выглядит примерно так:

{
    "table1": [
        {
            "name1": "data1", "name2": "data2", "name3": "data3",
        },
        {
            "name1": "data1", "name2": "data2", "name3": "data3"
        }
    ]
}
0 голосов
/ 21 октября 2019

Просто используйте точечную запись.

Рабочий пример:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        var json_str = "{ \"table1\":[{\"name1\":\"data1\"},{\"name2\":\"data2\"},{\"name3\":\"data3\"}],\"table2\":[{\"name1\":\"data1\"},{\"name2\":\"data2\"},{\"name3\":\"data3\"}]}";
        dynamic stuff = JsonConvert.DeserializeObject(json_str);

        Console.WriteLine(stuff.table2[0].name1); // prints "data1"

    }
}

Альтернатива:

stuff["table2"][0]["name1"]

Почему у вас не работает:

var abc=stuff.table1["name1"];

Вы не можете получить доступ к «name1» напрямую, потому что оно находится внутри массива объектов. Возьмите первый элемент с [0] и после этого вы можете получить доступ к name1.

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