Как конвертировать из Treeview в JSON в C# - PullRequest
1 голос
/ 02 августа 2020

Я следую , этот пример

, показанный выше, является примером данных, которые я загрузил в древовидном представлении введите описание изображения здесь

Сгенерированный выходной файл выглядит следующим образом.

[
  "TreeNode: name",
  "TreeNode: age",
  "TreeNode: John Doe",
  "TreeNode: 35"
]

Как мне сделать так, чтобы он выглядел так?

{
   "name": "John Doe",
   "age": 35
}

Это код, который Я использую для извлечения данных.

    var settings = new JsonSerializerSettings
    {
         Converters = new List<JsonConverter> { new TreeConverter() },
         Formatting = Formatting.Indented
    };
                           
    var Nodes = GetChildren(SettingsView.TopNode);
    
   string json = JsonConvert.SerializeObject(Nodes, settings);
   Console.WriteLine(json);
    
   System.IO.File.WriteAllText(@"C:\Sample Schema\example.txt", json);

Получить детей

public IEnumerable<TreeNode> GetChildren(TreeNode Parent)
        {
            return Parent.Nodes.Cast<TreeNode>().Concat(
                   Parent.Nodes.Cast<TreeNode>().SelectMany(GetChildren));
        }

Класс TreeConverter

public class TreeConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return (objectType == typeof(Node<Person>));
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            Node<Person> node = (Node<Person>)value;
            JObject obj = new JObject();
            obj.Add("Name", node.Value.name);
            obj.Add("Age", node.Value.age);
            obj.WriteTo(writer);
        }

        public override bool CanRead
        {
            get { return false; }
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }

Класс человека

public class Person
    {
        public string name { get; set; }
        public int age { get; set; }
    }

1 Ответ

0 голосов
/ 03 августа 2020

Все это кажется очень сложным, когда я думаю, вы должны смотреть на что-то вроде:

var x = rootNodes.Select(r => new Person(){
  name = r.Nodes[0].Nodes[0].Text,
  age = Convert.ToInt32(r.Nodes[1].Nodes[0].Text)
});

Затем сериализуйте x, который является перечислимым типом Person (и точка на этом; вы запросил json, который не является коллекцией / массивом et c, а является просто (свойствами) одного человека. Если в вашем дереве больше узлов, вы не сможете получить ни одного объекта, поэтому я полагаю, что отсутствие [ ] в вашем «Я хочу это json» - это опечатка?

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