Обработка вложенных объектов в JSON

  • Автор темы Автор темы DevOps
  • Дата начала Дата начала

DevOps

Client
Регистрация
30.11.2020
Сообщения
497
Реакции
316
Баллы
63
Добрый день форум
Подскажите как решить небольшой затык
Получаю данные по API десериализую и все идет нормально до следующего класса

C#:
Развернуть Свернуть Копировать
 public class Root
    {
        public string handle { get; set; }
        public List<object> vcardArray { get; set; }
        public List<string> roles { get; set; }
        public List<Entity> entities { get; set; }
        public string objectClassName { get; set; }
    }
Если для получения значения достаточно этого handle
C#:
Развернуть Свернуть Копировать
    var objectdata = JsonConvert.DeserializeObject<Root>(result);
    string handle = objectdata.handle;
То как обработать "вложку" public List<object> vcardArray никак не допру.
Подскажите как "разложить" объект на составляющие
Юзаю Newtonsoft.Json, но это не принципиально, могу перейти и на стандартное решение System.Text.Json;
Спасибо
 
Добрый день форум
Подскажите как решить небольшой затык
Получаю данные по API десериализую и все идет нормально до следующего класса

C#:
Развернуть Свернуть Копировать
 public class Root
    {
        public string handle { get; set; }
        public List<object> vcardArray { get; set; }
        public List<string> roles { get; set; }
        public List<Entity> entities { get; set; }
        public string objectClassName { get; set; }
    }
Если для получения значения достаточно этого handle
C#:
Развернуть Свернуть Копировать
    var objectdata = JsonConvert.DeserializeObject<Root>(result);
    string handle = objectdata.handle;
То как обработать "вложку" public List<object> vcardArray никак не допру.
Подскажите как "разложить" объект на составляющие
Юзаю Newtonsoft.Json, но это не принципиально, могу перейти и на стандартное решение System.Text.Json;
Спасибо
Как-то так примерно:
C#:
Развернуть Свернуть Копировать
var items = objectdata.vcardArray.ToList();
foreach(var item in items){
    project.SendInfoToLog(item.ToString());
}
 
  • Спасибо
Реакции: DevOps
C#:
Развернуть Свернуть Копировать
{
  "handle" : "45.155.207.0 - 45.155.207.255",
  "startAddress" : "45.155.207.0",
  "endAddress" : "45.155.207.255",
  "ipVersion" : "v4",
  "name" : "RU-ZTVCORP-20200902",
  "type" : "ASSIGNED PA",
  "country" : "RU",
  "parentHandle" : "45.155.204.0 - 45.155.207.255",
  "cidr0_cidrs" : [ {
    "v4prefix" : "45.155.207.0",
    "length" : 24
  } ],
  "entities" : [ {
    "handle" : "IP-RIPE",
    "roles" : [ "registrant" ],
    "objectClassName" : "entity"
  }, {
    "handle" : "ORG-ZTV1-RIPE",
    "roles" : [ "registrant" ],
    "objectClassName" : "entity"
  }, {
    "handle" : "ZCL3-RIPE",
    "roles" : [ "administrative", "technical" ],
    "objectClassName" : "entity"
  }, {
    "handle" : "ZCL3-RIPE",
    "vcardArray" : [ "vcard", [ [ "version", { }, "text", "4.0" ], [ "fn", { }, "text", "ZTV CORP LLC" ], [ "kind", { }, "text", "group" ], [ "adr", {
      "label" : "ul. Romanticheskaya, d. 12\nYaksatovo\nAstrakhanskaya obl.\n416462\nRussia"
    }, "text", [ "", "", "", "", "", "", "" ] ], [ "tel", {
      "type" : "voice"
    }, "text", "+7 999 8000369" ], [ "email", {
      "type" : "email"
    }, "text", "admin@ztv.su" ], [ "email", {
      "type" : "abuse"
    }, "text", "abuse@ztv.su" ] ] ],
    "roles" : [ "abuse" ],
    "entities" : [ {
      "handle" : "IP-RIPE",
      "roles" : [ "registrant" ],
      "objectClassName" : "entity"
    } ]
  }
Для создания нужных классов использую https://json2csharp.com/
Пишу в Студии 2022
Юзаю библ Newtonsoft.Json
С этим проблем нет

C#:
Развернуть Свернуть Копировать
 "handle" : "45.155.207.0 - 45.155.207.255",
  "startAddress" : "45.155.207.0",
  "endAddress" : "45.155.207.255",
  "ipVersion" : "v4",
  "name" : "RU-ZTVCORP-20200902",
  "type" : "ASSIGNED PA",
  "country" : "RU",
  "parentHandle" : "45.155.204.0 - 45.155.207.255",
Классы выглядят тактим образом

C#:
Развернуть Свернуть Копировать
public class Cidr0Cidr
{
    public string v4prefix { get; set; }
    public int length { get; set; }
}

public class Entity
{
    public string handle { get; set; }
    public List<string> roles { get; set; }
    public string objectClassName { get; set; }
    public List<object> vcardArray { get; set; }

    public List<Entity> entities { get; set; }

    internal object ToList()
    {
        throw new NotImplementedException();
    }
}

public class Event
{
    public string eventAction { get; set; }
    public DateTime eventDate { get; set; }
}

public class Link
{
    public string value { get; set; }
    public string rel { get; set; }
    public string href { get; set; }
    public string type { get; set; }
}

public class Notice
{
    public string title { get; set; }
    public List<string> description { get; set; }
    public List<Link> links { get; set; }
}

public class Root
{
    public string handle { get; set; }
    public string startAddress { get; set; }
    public string endAddress { get; set; }
    public string ipVersion { get; set; }
    public string name { get; set; }
    public string type { get; set; }
    public string country { get; set; }
    public string parentHandle { get; set; }
    public List<Cidr0Cidr> cidr0_cidrs { get; set; }
    public List<Entity> entities { get; set; }
    public List<Link> links { get; set; }
    public List<Event> events { get; set; }
    public List<string> rdapConformance { get; set; }
    public List<Notice> notices { get; set; }
    public string port43 { get; set; }
    public string objectClassName { get; set; }


}
 
C#:
Развернуть Свернуть Копировать
{
  "handle" : "45.155.207.0 - 45.155.207.255",
  "startAddress" : "45.155.207.0",
  "endAddress" : "45.155.207.255",
  "ipVersion" : "v4",
  "name" : "RU-ZTVCORP-20200902",
  "type" : "ASSIGNED PA",
  "country" : "RU",
  "parentHandle" : "45.155.204.0 - 45.155.207.255",
  "cidr0_cidrs" : [ {
    "v4prefix" : "45.155.207.0",
    "length" : 24
  } ],
  "entities" : [ {
    "handle" : "IP-RIPE",
    "roles" : [ "registrant" ],
    "objectClassName" : "entity"
  }, {
    "handle" : "ORG-ZTV1-RIPE",
    "roles" : [ "registrant" ],
    "objectClassName" : "entity"
  }, {
    "handle" : "ZCL3-RIPE",
    "roles" : [ "administrative", "technical" ],
    "objectClassName" : "entity"
  }, {
    "handle" : "ZCL3-RIPE",
    "vcardArray" : [ "vcard", [ [ "version", { }, "text", "4.0" ], [ "fn", { }, "text", "ZTV CORP LLC" ], [ "kind", { }, "text", "group" ], [ "adr", {
      "label" : "ul. Romanticheskaya, d. 12\nYaksatovo\nAstrakhanskaya obl.\n416462\nRussia"
    }, "text", [ "", "", "", "", "", "", "" ] ], [ "tel", {
      "type" : "voice"
    }, "text", "+7 999 8000369" ], [ "email", {
      "type" : "email"
    }, "text", "admin@ztv.su" ], [ "email", {
      "type" : "abuse"
    }, "text", "abuse@ztv.su" ] ] ],
    "roles" : [ "abuse" ],
    "entities" : [ {
      "handle" : "IP-RIPE",
      "roles" : [ "registrant" ],
      "objectClassName" : "entity"
    } ]
  }
Для создания нужных классов использую https://json2csharp.com/
Пишу в Студии 2022
Юзаю библ Newtonsoft.Json
С этим проблем нет

C#:
Развернуть Свернуть Копировать
 "handle" : "45.155.207.0 - 45.155.207.255",
  "startAddress" : "45.155.207.0",
  "endAddress" : "45.155.207.255",
  "ipVersion" : "v4",
  "name" : "RU-ZTVCORP-20200902",
  "type" : "ASSIGNED PA",
  "country" : "RU",
  "parentHandle" : "45.155.204.0 - 45.155.207.255",
Классы выглядят тактим образом

C#:
Развернуть Свернуть Копировать
public class Cidr0Cidr
{
    public string v4prefix { get; set; }
    public int length { get; set; }
}

public class Entity
{
    public string handle { get; set; }
    public List<string> roles { get; set; }
    public string objectClassName { get; set; }
    public List<object> vcardArray { get; set; }

    public List<Entity> entities { get; set; }

    internal object ToList()
    {
        throw new NotImplementedException();
    }
}

public class Event
{
    public string eventAction { get; set; }
    public DateTime eventDate { get; set; }
}

public class Link
{
    public string value { get; set; }
    public string rel { get; set; }
    public string href { get; set; }
    public string type { get; set; }
}

public class Notice
{
    public string title { get; set; }
    public List<string> description { get; set; }
    public List<Link> links { get; set; }
}

public class Root
{
    public string handle { get; set; }
    public string startAddress { get; set; }
    public string endAddress { get; set; }
    public string ipVersion { get; set; }
    public string name { get; set; }
    public string type { get; set; }
    public string country { get; set; }
    public string parentHandle { get; set; }
    public List<Cidr0Cidr> cidr0_cidrs { get; set; }
    public List<Entity> entities { get; set; }
    public List<Link> links { get; set; }
    public List<Event> events { get; set; }
    public List<string> rdapConformance { get; set; }
    public List<Notice> notices { get; set; }
    public string port43 { get; set; }
    public string objectClassName { get; set; }


}
Json с ошибкой. Нормальный пришлите
 
Json с ошибкой. Нормальный пришлите
C#:
Развернуть Свернуть Копировать
{
  "handle" : "45.155.207.0 - 45.155.207.255",
  "startAddress" : "45.155.207.0",
  "endAddress" : "45.155.207.255",
  "ipVersion" : "v4",
  "name" : "RU-ZTVCORP-20200902",
  "type" : "ASSIGNED PA",
  "country" : "RU",
  "parentHandle" : "45.155.204.0 - 45.155.207.255",
  "cidr0_cidrs" : [ {
    "v4prefix" : "45.155.207.0",
    "length" : 24
  } ],
  "entities" : [ {
    "handle" : "IP-RIPE",
    "roles" : [ "registrant" ],
    "objectClassName" : "entity"
  }, {
    "handle" : "ORG-ZTV1-RIPE",
    "roles" : [ "registrant" ],
    "objectClassName" : "entity"
  }, {
    "handle" : "ZCL3-RIPE",
    "roles" : [ "administrative", "technical" ],
    "objectClassName" : "entity"
  }, {
    "handle" : "ZCL3-RIPE",
    "vcardArray" : [ "vcard", [ [ "version", { }, "text", "4.0" ], [ "fn", { }, "text", "ZTV CORP LLC" ], [ "kind", { }, "text", "group" ], [ "adr", {
      "label" : "ul. Romanticheskaya, d. 12\nYaksatovo\nAstrakhanskaya obl.\n416462\nRussia"
    }, "text", [ "", "", "", "", "", "", "" ] ], [ "tel", {
      "type" : "voice"
    }, "text", "+7 999 8000369" ], [ "email", {
      "type" : "email"
    }, "text", "admin@ztv.su" ], [ "email", {
      "type" : "abuse"
    }, "text", "abuse@ztv.su" ] ] ],
    "roles" : [ "abuse" ],
    "entities" : [ {
      "handle" : "IP-RIPE",
      "roles" : [ "registrant" ],
      "objectClassName" : "entity"
    } ],
    "objectClassName" : "entity"
  } ],
  "links" : [ {
    "value" : "http://close",
    "rel" : "self",
    "href" : "http://close"
  }, {
    "value" : "http://close",
    "rel" : "copyright",
    "href" : "http://close"
  } ],
  "events" : [ {
    "eventAction" : "last changed",
    "eventDate" : "2022-01-26T13:17:29Z"
  } ],
  "rdapConformance" : [ "cidr0", "UO_level_0" ],
  "notices" : [ {
    "title" : "Filtered",
    "description" : [ "This output has been filtered." ]
  }, {
    "title" : "Source",
    "description" : [ "Objects returned came from source", "UO" ]
  }, {
    "title" : "Terms and Conditions",
    "description" : [ "This is the Database query service. The objects are in UO format." ],
    "links" : [ {
      "value" : "http://close",
      "rel" : "terms-of-service",
      "href" : "http://close",
      "type" : "application/pdf"
    } ]
  } ],
  "port43" : "whois",
  "objectClassName" : "ip network"
}
 
Для создания нужных классов использую https://json2csharp.com/
Пишу в Студии 2022
Юзаю библ Newtonsoft.Json
Для создания классов в студии, Правка=>Специальная вставка=>Вставить Json
98872


Получаем что-то вроде этого:
C#:
Развернуть Свернуть Копировать
public class Rootobject {
    public string handle { get; set; }
    public string startAddress { get; set; }
    public string endAddress { get; set; }
    public string ipVersion { get; set; }
    public string name { get; set; }
    public string type { get; set; }
    public string country { get; set; }
    public string parentHandle { get; set; }
    public Cidr0_Cidrs[] cidr0_cidrs { get; set; }
    public Entity[] entities { get; set; }
    public Link[] links { get; set; }
    public Event[] events { get; set; }
    public string[] rdapConformance { get; set; }
    public Notice[] notices { get; set; }
    public string port43 { get; set; }
    public string objectClassName { get; set; }
}

public class Cidr0_Cidrs {
    public string v4prefix { get; set; }
    public int length { get; set; }
}

public class Entity {
    public string handle { get; set; }
    public string[] roles { get; set; }
    public string objectClassName { get; set; }
    public object[] vcardArray { get; set; }
    public Entity1[] entities { get; set; }
}

public class Entity1 {
    public string handle { get; set; }
    public string[] roles { get; set; }
    public string objectClassName { get; set; }
}

public class Link {
    public string value { get; set; }
    public string rel { get; set; }
    public string href { get; set; }
}

public class Event {
    public string eventAction { get; set; }
    public DateTime eventDate { get; set; }
}

public class Notice {
    public string title { get; set; }
    public string[] description { get; set; }
    public Link1[] links { get; set; }
}

public class Link1 {
    public string value { get; set; }
    public string rel { get; set; }
    public string href { get; set; }
    public string type { get; set; }
}

vcardArray сидит внутри Entity
 
  • Спасибо
Реакции: DevOps
Для создания классов в студии, Правка=>Специальная вставка=>Вставить Json
Посмотреть вложение 98872

Получаем что-то вроде этого:
C#:
Развернуть Свернуть Копировать
public class Rootobject {
    public string handle { get; set; }
    public string startAddress { get; set; }
    public string endAddress { get; set; }
    public string ipVersion { get; set; }
    public string name { get; set; }
    public string type { get; set; }
    public string country { get; set; }
    public string parentHandle { get; set; }
    public Cidr0_Cidrs[] cidr0_cidrs { get; set; }
    public Entity[] entities { get; set; }
    public Link[] links { get; set; }
    public Event[] events { get; set; }
    public string[] rdapConformance { get; set; }
    public Notice[] notices { get; set; }
    public string port43 { get; set; }
    public string objectClassName { get; set; }
}

public class Cidr0_Cidrs {
    public string v4prefix { get; set; }
    public int length { get; set; }
}

public class Entity {
    public string handle { get; set; }
    public string[] roles { get; set; }
    public string objectClassName { get; set; }
    public object[] vcardArray { get; set; }
    public Entity1[] entities { get; set; }
}

public class Entity1 {
    public string handle { get; set; }
    public string[] roles { get; set; }
    public string objectClassName { get; set; }
}

public class Link {
    public string value { get; set; }
    public string rel { get; set; }
    public string href { get; set; }
}

public class Event {
    public string eventAction { get; set; }
    public DateTime eventDate { get; set; }
}

public class Notice {
    public string title { get; set; }
    public string[] description { get; set; }
    public Link1[] links { get; set; }
}

public class Link1 {
    public string value { get; set; }
    public string rel { get; set; }
    public string href { get; set; }
    public string type { get; set; }
}

vcardArray сидит внутри Entity
Спасибо, очень удобно, поэтому и сел за Студию
Но вопрос в заголовке- как распарсить объект в классе :-)
Ну не догоняю никак
PS После вставки по Вашей инструкции не внимательно глянул классы, теперь все понятно, спасибо
 
Последнее редактирование:
Вы писали что используете онлайн конвертер.
Для создания нужных классов использую https://json2csharp.com/
Но при этом используете студию.
А для сложных объектов - он кривой, не всегда отдает то что нужно.
Из-за чего я попытался помочь Вам тем, что объяснил как можно сгенерировать валидный код через студию.

К сожалению, у меня не было в тот момент времени, чтобы более подробно описывать что к чему, из-за чего я просто постарался быстро, но более-менее понятно изложить в чем дело. Простите, что не объяснил сразу в чем проблема.

Хорошего вечера.
Рад, что проблема была решена.
 
  • Спасибо
Реакции: DevOps
Вы писали что используете онлайн конвертер.

Но при этом используете студию.
А для сложных объектов - он кривой, не всегда отдает то что нужно.
Из-за чего я попытался помочь Вам тем, что объяснил как можно сгенерировать валидный код через студию.

К сожалению, у меня не было в тот момент времени, чтобы более подробно описывать что к чему, из-за чего я просто постарался быстро, но более-менее понятно изложить в чем дело. Простите, что не объяснил сразу в чем проблема.

Хорошего вечера.
Рад, что проблема была решена.
Да спасибо, но один хер вытащить оттуда ничего не могу,хз что за ублюдок такой массив создавал
 
Да спасибо, но один хер вытащить оттуда ничего не могу,хз что за ублюдок такой массив создавал
Как не можете?

C#:
Развернуть Свернуть Копировать
var root= JsonConvert.DeserializeObject<Rootobject>(result);
var ob = root.entities; // все сущности объекты
var array = ob[0].vcardArray; // массив первой сущности
далее перебираем его в цикле
 
  • Спасибо
Реакции: DevOps
Как не можете?

C#:
Развернуть Свернуть Копировать
var root= JsonConvert.DeserializeObject<Rootobject>(result);
var ob = root.entities; // все сущности объекты
var array = ob[0].vcardArray; // массив первой сущности
далее перебираем его в цикле
Все что я за эти 2 суток сумел вытащить это System.Collections.Generic.List`1[System.Object]
или эксепшен System.NullReferenceException: "Object reference not set to an instance of an object."
с JSON ранее не работал, вот понадобилось и "воткнулся". Зачем епта такая вложеность вообще нужна хз
 
Все что я за эти 2 суток сумел вытащить это System.Collections.Generic.List`1[System.Object]
или эксепшен System.NullReferenceException: "Object reference not set to an instance of an object."
Вы точно используете в текущий момент код который я предоставил?
Ваш JSON точно такой, как Вы предоставили, или другой?
Сейчас ещё раз повторно проверю - отпишусь минут через 15.
 
  • Спасибо
Реакции: DevOps
C#:
Развернуть Свернуть Копировать
string json = project.Variables["json"].Value; // тот json который Вы давали выше
// В общем коде находится код классов без изменений, тот который также бросал выше
Rootobject root = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Rootobject>(json);
//project.SendInfoToLog(string.Format("{0}",root.entities.Length ));
for(int i=0; i<root.entities.Length; i++) {
    var ob = root.entities[i];
    //project.SendInfoToLog(string.Format("{0}",Global.ZennoLab.Json.JsonConvert.SerializeObject(ob,  Global.ZennoLab.Json.Formatting.Indented)));
    if(ob.vcardArray!=null){
        var items = ob.vcardArray;
        foreach(var item in items) {
            // один элемент из vcardArray - здесь уже с ним можно делать все что угодно
            project.SendInfoToLog(string.Format("{0}",Global.ZennoLab.Json.JsonConvert.SerializeObject(item,  Global.ZennoLab.Json.Formatting.Indented)));
        }
    }
}
 
  • Спасибо
Реакции: DevOps
Вы точно используете в текущий момент код который я предоставил?
Ваш JSON точно такой, как Вы предоставили, или другой?
Сейчас ещё раз повторно проверю - отпишусь минут через 15.
Грубо черновик, не пинайте, на тестах не заморачиваюсь
C#:
Развернуть Свернуть Копировать
using System.Net;
using Newtonsoft.Json;


object locker = new object();
object locker_out = new object();
string path_in = @"C:\Users\Mayersk\Desktop\IN.txt";
string path_out = @"C:\Users\Mayersk\Desktop\OUT.txt";
int threads = 10;
Queue<string> prox = new Queue<string>();
string[] lines = File.ReadAllLines(path_in);
Queue<string> q = new Queue<string>();
string line = string.Empty;
string startAddress = string.Empty;
foreach (string ptf in lines)
{
    q.Enqueue(ptf);
}
for (int i = 0; i < threads; i++)
{
    Thread myThread = new Thread(() => Parser(q));
    myThread.Start();
}
void Parser(Queue<string> q)
{
    try
    {
        int count = q.Count;

        for (int i = 0; i < count; i++)
        {
            lock (locker)
            {
                line = q.Dequeue();
            }
            string lines = line.ToString();
            string[] text = lines.Split(";");
            string ns = text[0].ToString();
            string ip = text[1].ToString();
            
            using (var client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }))
            {
                client.BaseAddress = new Uri(ip);
                HttpResponseMessage response = client.GetAsync(ip).Result;
                string result = response.Content.ReadAsStringAsync().Result;
                Console.WriteLine();

                var objectdata2 = JsonConvert.DeserializeObject<Entity>(result);
                var root = JsonConvert.DeserializeObject<Rootobject>(result);
                var ob = root.entities;
                var array = ob[0].vcardArray;
                string alfa = array.ToString();

                    Console.WriteLine(alfa);

                string startAddress = root.startAddress;
                string endAddress = root.endAddress;
                string name = root.name;
                string country = root.country;
                string data_out = ns + ";" + ip + ";" + startAddress + "-" + endAddress + ";" + name + ";" + country;

                {
                    Console.WriteLine(data_out);
                }
            }
        }
    }
    catch (Exception Ex)
    {
        Console.WriteLine(Ex);
    }
    
}

public class Rootobject
{
    public string handle { get; set; }
    public string startAddress { get; set; }
    public string endAddress { get; set; }
    public string ipVersion { get; set; }
    public string name { get; set; }
    public string type { get; set; }
    public string country { get; set; }
    public string parentHandle { get; set; }
    public Cidr0_Cidrs[] cidr0_cidrs { get; set; }
    public Entity[] entities { get; set; }
    public Link[] links { get; set; }
    public Event[] events { get; set; }
    public string[] rdapConformance { get; set; }
    public Notice[] notices { get; set; }
    public string port43 { get; set; }
    public string objectClassName { get; set; }
}

public class Cidr0_Cidrs
{
    public string v4prefix { get; set; }
    public int length { get; set; }
}

public class Entity
{
    public string handle { get; set; }
    public string[] roles { get; set; }
    public string objectClassName { get; set; }
    public object[] vcardArray { get; set; }
    public Entity1[] entities { get; set; }
}

public class Entity1
{
    public string handle { get; set; }
    public string[] roles { get; set; }
    public string objectClassName { get; set; }
}

public class Link
{
    public string value { get; set; }
    public string rel { get; set; }
    public string href { get; set; }
}

public class Event
{
    public string eventAction { get; set; }
    public DateTime eventDate { get; set; }
}

public class Notice
{
    public string title { get; set; }
    public string[] description { get; set; }
    public Link1[] links { get; set; }
}

public class Link1
{
    public string value { get; set; }
    public string rel { get; set; }
    public string href { get; set; }
    public string type { get; set; }
}

Тут все собирает, в принципе этого достаточно, но уже задело

C#:
Развернуть Свернуть Копировать
                string startAddress = root.startAddress;
                string endAddress = root.endAddress;
                string name = root.name;
                string country = root.country;
                string data_out = ns + ";" + ip + ";" + startAddress + "-" + endAddress + ";" + name + ";" + country;
 
  • Спасибо
Реакции: BAZAg
Грубо черновик, не пинайте, на тестах не заморачиваюсь

C#:
Развернуть Свернуть Копировать
using System.Net;
using Newtonsoft.Json;

object locker = new object();
object locker_out = new object();
string path_in = @"C:\Users\Mayersk\Desktop\IN.txt";
string path_out = @"C:\Users\Mayersk\Desktop\OUT.txt";
int threads = 10;
Queue<string> prox = new Queue<string>();
string[] lines = File.ReadAllLines(path_in);
Queue<string> q = new Queue<string>();
string line = string.Empty;
string startAddress = string.Empty;
foreach (string ptf in lines) {
    q.Enqueue(ptf);
}

for (int i = 0; i < threads; i++){
    Thread myThread = new Thread(() => Parser(q));
    myThread.Start();
}

void Parser(Queue<string> q) {
    try {
        int count = q.Count;
        for (int i = 0; i < count; i++) {

            lock (locker) {
                line = q.Dequeue();
            }

            string lines = line.ToString();
            string[] text = lines.Split(";");
            string ns = text[0].ToString();
            string ip = text[1].ToString();

            using (var client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate })) {
                client.BaseAddress = new Uri(ip);
                HttpResponseMessage response = client.GetAsync(ip).Result;
                string result = response.Content.ReadAsStringAsync().Result;
                Console.WriteLine();
               
                var objectdata2 = JsonConvert.DeserializeObject<Entity>(result);
                var root = JsonConvert.DeserializeObject<Rootobject>(result);
                var ob = root.entities;
                var array = ob[0].vcardArray;
                string alfa = array.ToString();
                Console.WriteLine(alfa);

                string startAddress = root.startAddress;
                string endAddress = root.endAddress;
                string name = root.name;
                string country = root.country;
                string data_out = ns + ";" + ip + ";" + startAddress + "-" + endAddress + ";" + name + ";" + country;
               
                Console.WriteLine(data_out);
            }
        }
    }
    catch (Exception Ex){
        Console.WriteLine(Ex);
    }
}

public class Rootobject{
    public string handle { get; set; }
    public string startAddress { get; set; }
    public string endAddress { get; set; }
    public string ipVersion { get; set; }
    public string name { get; set; }
    public string type { get; set; }
    public string country { get; set; }
    public string parentHandle { get; set; }
    public Cidr0_Cidrs[] cidr0_cidrs { get; set; }
    public Entity[] entities { get; set; }
    public Link[] links { get; set; }
    public Event[] events { get; set; }
    public string[] rdapConformance { get; set; }
    public Notice[] notices { get; set; }
    public string port43 { get; set; }
    public string objectClassName { get; set; }

}
public class Cidr0_Cidrs{
    public string v4prefix { get; set; }
    public int length { get; set; }
}
public class Entity{
    public string handle { get; set; }
    public string[] roles { get; set; }
    public string objectClassName { get; set; }
    public object[] vcardArray { get; set; }
    public Entity1[] entities { get; set; }
}
public class Entity1{
    public string handle { get; set; }
    public string[] roles { get; set; }
    public string objectClassName { get; set; }
}
public class Link{
    public string value { get; set; }
    public string rel { get; set; }
    public string href { get; set; }
}
public class Event{
    public string eventAction { get; set; }
    public DateTime eventDate { get; set; }
}
public class Notice{
    public string title { get; set; }
    public string[] description { get; set; }
    public Link1[] links { get; set; }

}
public class Link1 {
    public string value { get; set; }
    public string rel { get; set; }
    public string href { get; set; }
    public string type { get; set; }

}
Тут все собирает, в принципе этого достаточно, но уже задело
C#:
Развернуть Свернуть Копировать
string startAddress = root.startAddress;
string endAddress = root.endAddress;
string name = root.name;
string country = root.country;
string data_out = ns + ";" + ip + ";" + startAddress + "-" + endAddress + ";" + name + ";" + country;

Я бы все же рекомендовал отделить запрос от обработки результата, выделив эти блоки кода в отдельные методы.
Хотя, с другой стороны, если все работает - оставляйте как есть и все дела.

C#:
Развернуть Свернуть Копировать
public static string Get(string ip){
    string result = string.Empty;
    try{
        using (var client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate })) {
            client.BaseAddress = new Uri(ip);
            var response = client.GetAsync(ip).Result;
            result = response.Content.ReadAsStringAsync().Result;
        }
    }
    catch {
        result = string.Empty;
    }
    return result;
}

C#:
Развернуть Свернуть Копировать
public static string Data(string ns, string ip, string json){
    string[] out_data = new string[5];
    out_data[0] = ns;
    out_data[1] = ip;
    string json = Get(ip); // вызов get
    if(!string.IsNullOrEmpty(json)) {
        var root = JsonConvert.DeserializeObject<Rootobject>(json);
        var ob = root.entities;
        var array = ob[0].vcardArray; //хм.. нигде не используется... + проверка на null нужна будет
        string alfa = array.ToString();
        string startAddress = root.startAddress;
        string endAddress = root.endAddress;
        string name = root.name;
        string country = root.country;
        out_data[2] = startAddress + "-" + endAddress;
        out_data[3] = name;
        out_data[4] = country;
    }
    return string.Join(";", out_data);        
}
 
  • Спасибо
Реакции: Dome4ta1
Всем здравия! Форумчане , помогите к кодом. Вообще пока не владею кодом, так, поверхностно совсем.
Есть задача распарсить json в переменные.
пользуюсь этим кодом
C#:
Развернуть Свернуть Копировать
//парсим json
project.Json.FromString(project.Variables["token_json"].Value);
//берем нужное св-во в переменную
project.Variables["conf_signal"].Value = project.Json.conf_signal;
но этот код работает исключительно со строками, обрабатывать числа он не хочет! Что делать, как решить задачу? например чтобы данные из запроса корректно обрабатывать и класть в переменные
C#:
Развернуть Свернуть Копировать
{
    "ret_code": 0,
    "ret_msg": "OK",
    "time_now": "1666706180.267360",
    "rate_limit_status": 118,
    "rate_limit_reset_ms": 1666706180258,
    "cum": -8.22451243,
}
 
Всем здравия! Форумчане , помогите к кодом. Вообще пока не владею кодом, так, поверхностно совсем.
Есть задача распарсить json в переменные.
пользуюсь этим кодом
C#:
Развернуть Свернуть Копировать
//парсим json
project.Json.FromString(project.Variables["token_json"].Value);
//берем нужное св-во в переменную
project.Variables["conf_signal"].Value = project.Json.conf_signal;
но этот код работает исключительно со строками, обрабатывать числа он не хочет! Что делать, как решить задачу? например чтобы данные из запроса корректно обрабатывать и класть в переменные
C#:
Развернуть Свернуть Копировать
{
    "ret_code": 0,
    "ret_msg": "OK",
    "time_now": "1666706180.267360",
    "rate_limit_status": 118,
    "rate_limit_reset_ms": 1666706180258,
    "cum": -8.22451243,
}
Внутри Вашего исходного json нет поля conf_signal
Можете попробовать использовать примерно такой код, чтобы с одной стороны не появлялись ошибки, если поля нет.
С другой, чтобы привести не известный тип данных к строке.
C#:
Развернуть Свернуть Копировать
string json = project.Variables["json"].Value;
string line = string.Empty;
try {
    var data = Global.ZennoLab.Json.JsonConvert.DeserializeObject<dynamic>(json); //парсим json
    string member = "time_now";
    try {
        line = data[member].ToObject<string>();//берем нужное св-во в переменную
    }
    catch {
        project.SendWarningToLog(string.Format("member не найден: {0}",member),true);    
    }
}
catch {
    project.SendWarningToLog("JSON не валидный", true);
}
project.Variables["conf_signal"].Value = line;// сохранили результат
99224
 
Последнее редактирование:
Внутри Вашего исходного json нет поля conf_signal
Можете попробовать использовать примерно такой код, чтобы с одной стороны не появлялись ошибки, если поля нет.
С другой, чтобы привести не известный тип данных к строке.
C#:
Развернуть Свернуть Копировать
string json = project.Variables["json"].Value;
string line = string.Empty;
try {
    var data = Global.ZennoLab.Json.JsonConvert.DeserializeObject<dynamic>(json); //парсим json
    string member = "time_now";
    try {
        line = data[member].ToObject<string>();//берем нужное св-во в переменную
    }
    catch {
        project.SendWarningToLog(string.Format("member не найден: {0}",member),true);   
    }
}
catch {
    project.SendWarningToLog("JSON не валидный", true);
}
project.Variables["conf_signal"].Value = line;// сохранили результат
Посмотреть вложение 99224
Благодарствую,
А если мне нужно вытащить выборочно данные и положить их в переменные? , например:
"time_now" в "time"
"user_id" в "user"
"time_now" в "time"

так чтобы это всё было реализовано в одном кубике

C#:
Развернуть Свернуть Копировать
{
    "ret_code": 0,
    "ret_msg": "OK",
    "result": [
        {
            "user_id": 41548293,
            "mode": "BothSide"
        },
        {
            "user_id": ,
            "mode": ""
        }
    ],
    "ext_code": "",
    "ext_info": "",
    "time_now": "1667653941.734579",
    "rate_limit_status": 119,
    "rate_limit_reset_ms": 1667653941731,
    "rate_limit": 120
}
 
Благодарствую,
А если мне нужно вытащить выборочно данные и положить их в переменные? , например:
"time_now" в "time"
"user_id" в "user"
"time_now" в "time"

так чтобы это всё было реализовано в одном кубике

C#:
Развернуть Свернуть Копировать
{
    "ret_code": 0,
    "ret_msg": "OK",
    "result": [
        {
            "user_id": 41548293,
            "mode": "BothSide"
        },
        {
            "user_id": ,
            "mode": ""
        }
    ],
    "ext_code": "",
    "ext_info": "",
    "time_now": "1667653941.734579",
    "rate_limit_status": 119,
    "rate_limit_reset_ms": 1667653941731,
    "rate_limit": 120
}
Перечислите имена переменных куда сохранить эти два user_id.
Что делать если там будет 100 элементов user_id - в какие именно переменные с какими именами Вы хотите их сохранять?
99231
 
Добро. хотел законспирироваться , да ладно...
Вот json-ответ:
JSON:
Развернуть Свернуть Копировать
{
    "ret_code": 0,
    "ret_msg": "OK",
    "ext_code": "",
    "ext_info": "",
    "result": [
        {
            "user_id": 41548293,
            "symbol": "REEFUSDT",
            "side": "Buy",
            "size": 0,
            "position_value": 0,
            "entry_price": 0,
            "liq_price": 0,
            "bust_price": 0,
            "leverage": 10,
            "auto_add_margin": 0,
            "is_isolated": true,
            "position_margin": 0,
            "occ_closing_fee": 0,
            "realised_pnl": 0,
            "cum_realised_pnl": 0,
            "free_qty": 0,
            "tp_sl_mode": "Full",
            "unrealised_pnl": 0,
            "deleverage_indicator": 0,
            "risk_id": 1,
            "stop_loss": 0,
            "take_profit": 0,
            "trailing_stop": 0,
            "position_idx": 1,
            "mode": "BothSide"
        },
        {
            "user_id": 41548293,
            "symbol": "REEFUSDT",
            "side": "Sell",
            "size": 1000,
            "position_value": 5.74,
            "entry_price": 0.00574,
            "liq_price": 0.00608,
            "bust_price": 0.00631,
            "leverage": 10,
            "auto_add_margin": 0,
            "is_isolated": true,
            "position_margin": 0.5740024,
            "occ_closing_fee": 0.003786,
            "realised_pnl": -0.003444,
            "cum_realised_pnl": -0.003444,
            "free_qty": 1000,
            "tp_sl_mode": "Full",
            "unrealised_pnl": -0.005,
            "deleverage_indicator": 2,
            "risk_id": 1,
            "stop_loss": 0,
            "take_profit": 0,
            "trailing_stop": 0,
            "position_idx": 2,
            "mode": "BothSide"
        }
    ],
    "time_now": "1666706175.967156",
    "rate_limit_status": 119,
    "rate_limit_reset_ms": 1666706175965,
    "rate_limit": 120
}

Задача состоит в том, чтобы выдернуть данные в зависимость от открытой позиции ордера. Если у переменной проекта {-Variable.position_side-} значение "Buy", то спарсить нужно соответствующую часть ответа в json это "side": "Buy", если в {-Variable.position_side-} "Sell", то соответственно "side": "Sell". Если в {-Variable.position_side-} пусто, то и выйти из кубика через красную точку.

Сейчас у меня такая конструкция
C#:
Развернуть Свернуть Копировать
//парсим json
project.Json.FromString(project.Variables["position_json"].Value);
//берем нужное св-во в переменную
project.Variables["position_pnl"].Value = Convert.ToString(project.Json.result[0].unrealised_pnl).Replace(",",".");
project.Variables["position_margin"].Value = Convert.ToString(project.Json.result[0].position_margin).Replace(",",".");
project.Variables["position_side"].Value = Convert.ToString(project.Json.result[0].side);
project.Variables["tmp_signal_old"].Value = Convert.ToString(project.Json.result[0].side);
project.Variables["position_size"].Value = Convert.ToString(project.Json.result[0].size);
project.Variables["position_simbol"].Value = Convert.ToString(project.Json.result[0].symbol);
project.Variables["position_entry_price"].Value = Convert.ToString(project.Json.result[0].entry_price).Replace(",",".");
project.Variables["position_json_utime"].Value = Convert.ToString(project.Json.time_now);

Она меня полностью устраивает за исключением того, что я не знаю как динамически менять в json-пермепенных project.Json.result[0].symbol) номер массива (или как правильно это называется я пока не знаю) с 0 на 1 в зависимости от значения в {-Variable.position_side-}, где 0 это Buy, а 1 это Sell. И как видно в моем примере, у некоторых значений мне нужно менять запятую на точку.
 
Добро. хотел законспирироваться , да ладно...
Вот json-ответ:
JSON:
Развернуть Свернуть Копировать
{
    "ret_code": 0,
    "ret_msg": "OK",
    "ext_code": "",
    "ext_info": "",
    "result": [
        {
            "user_id": 41548293,
            "symbol": "REEFUSDT",
            "side": "Buy",
            "size": 0,
            "position_value": 0,
            "entry_price": 0,
            "liq_price": 0,
            "bust_price": 0,
            "leverage": 10,
            "auto_add_margin": 0,
            "is_isolated": true,
            "position_margin": 0,
            "occ_closing_fee": 0,
            "realised_pnl": 0,
            "cum_realised_pnl": 0,
            "free_qty": 0,
            "tp_sl_mode": "Full",
            "unrealised_pnl": 0,
            "deleverage_indicator": 0,
            "risk_id": 1,
            "stop_loss": 0,
            "take_profit": 0,
            "trailing_stop": 0,
            "position_idx": 1,
            "mode": "BothSide"
        },
        {
            "user_id": 41548293,
            "symbol": "REEFUSDT",
            "side": "Sell",
            "size": 1000,
            "position_value": 5.74,
            "entry_price": 0.00574,
            "liq_price": 0.00608,
            "bust_price": 0.00631,
            "leverage": 10,
            "auto_add_margin": 0,
            "is_isolated": true,
            "position_margin": 0.5740024,
            "occ_closing_fee": 0.003786,
            "realised_pnl": -0.003444,
            "cum_realised_pnl": -0.003444,
            "free_qty": 1000,
            "tp_sl_mode": "Full",
            "unrealised_pnl": -0.005,
            "deleverage_indicator": 2,
            "risk_id": 1,
            "stop_loss": 0,
            "take_profit": 0,
            "trailing_stop": 0,
            "position_idx": 2,
            "mode": "BothSide"
        }
    ],
    "time_now": "1666706175.967156",
    "rate_limit_status": 119,
    "rate_limit_reset_ms": 1666706175965,
    "rate_limit": 120
}

Задача состоит в том, чтобы выдернуть данные в зависимость от открытой позиции ордера. Если у переменной проекта {-Variable.position_side-} значение "Buy", то спарсить нужно соответствующую часть ответа в json это "side": "Buy", если в {-Variable.position_side-} "Sell", то соответственно "side": "Sell". Если в {-Variable.position_side-} пусто, то и выйти из кубика через красную точку.

Сейчас у меня такая конструкция
C#:
Развернуть Свернуть Копировать
//парсим json
project.Json.FromString(project.Variables["position_json"].Value);
//берем нужное св-во в переменную
project.Variables["position_pnl"].Value = Convert.ToString(project.Json.result[0].unrealised_pnl).Replace(",",".");
project.Variables["position_margin"].Value = Convert.ToString(project.Json.result[0].position_margin).Replace(",",".");
project.Variables["position_side"].Value = Convert.ToString(project.Json.result[0].side);
project.Variables["tmp_signal_old"].Value = Convert.ToString(project.Json.result[0].side);
project.Variables["position_size"].Value = Convert.ToString(project.Json.result[0].size);
project.Variables["position_simbol"].Value = Convert.ToString(project.Json.result[0].symbol);
project.Variables["position_entry_price"].Value = Convert.ToString(project.Json.result[0].entry_price).Replace(",",".");
project.Variables["position_json_utime"].Value = Convert.ToString(project.Json.time_now);

Она меня полностью устраивает за исключением того, что я не знаю как динамически менять в json-пермепенных project.Json.result[0].symbol) номер массива (или как правильно это называется я пока не знаю) с 0 на 1 в зависимости от значения в {-Variable.position_side-}, где 0 это Buy, а 1 это Sell. И как видно в моем примере, у некоторых значений мне нужно менять запятую на точку.
Так просто собирайте данные в таблицу, а дальше уже делайте с ними все что считаете нужным.
Вот пример:
C#:
Развернуть Свернуть Копировать
string json = project.Variables["json"].Value;
project.Json.FromString(json);
var tb = project.Tables["tb"];
if(project.Json.result.Count > 0) {
    project.SendInfoToLog(string.Format(@"Найдено столько-то результатов: {0}", project.Json.result.Count));
    for(int i = 0;i<project.Json.result.Count;i++) {
        string[] row = new string[25];
        var item = project.Json.result[i]; // взяли элемент с массива
        row[0] = item.user_id != null ? item.user_id.ToString() : string.Empty;
        row[1] = item.symbol != null ? item.symbol.ToString() : string.Empty;
        row[2] = item.side != null ? item.side.ToString() : string.Empty;
        row[3] = item.size != null ? item.size.ToString() : string.Empty;
        row[4] = item.position_value != null ? item.position_value.ToString() : string.Empty;
        row[5] = item.entry_price != null ? item.entry_price.ToString() : string.Empty;
        row[6] = item.liq_price != null ? item.liq_price.ToString() : string.Empty;
        row[7] = item.bust_price != null ? item.bust_price.ToString() : string.Empty;
        row[8] = item.leverage != null ? item.leverage.ToString() : string.Empty;
        row[9] = item.auto_add_margin != null ? item.auto_add_margin.ToString() : string.Empty;
        row[10] = item.is_isolated != null ? item.is_isolated.ToString() : string.Empty;
        row[11] = item.position_margin != null ? item.position_margin.ToString() : string.Empty;       
        row[12] = item.occ_closing_fee != null ? item.occ_closing_fee.ToString() : string.Empty;
        row[13] = item.realised_pnl != null ? item.realised_pnl.ToString() : string.Empty;
        row[14] = item.cum_realised_pnl != null ? item.cum_realised_pnl.ToString() : string.Empty;
        row[15] = item.free_qty != null ? item.free_qty.ToString() : string.Empty;
        row[16] = item.tp_sl_mode != null ? item.tp_sl_mode.ToString() : string.Empty;       
        row[17] = item.unrealised_pnl != null ? item.unrealised_pnl.ToString() : string.Empty;
        row[18] = item.deleverage_indicator != null ? item.deleverage_indicator.ToString() : string.Empty;
        row[19] = item.risk_id != null ? item.risk_id.ToString() : string.Empty;
        row[20] = item.stop_loss != null ? item.stop_loss.ToString() : string.Empty;       
        row[21] = item.take_profit != null ? item.take_profit.ToString() : string.Empty;
        row[22] = item.trailing_stop != null ? item.trailing_stop.ToString() : string.Empty;
        row[23] = item.position_idx != null ? item.position_idx.ToString() : string.Empty;
        row[24] = item.mode != null ? item.mode.ToString() : string.Empty;       
        if(!string.IsNullOrEmpty(row[2])) tb.AddRow(row);       
    }
}
99243
 
  • Спасибо
Реакции: vedi108 и Alexmd
Она меня полностью устраивает за исключением того, что я не знаю как динамически менять в json-пермепенных project.Json.result[0].symbol) номер массива (или как правильно это называется я пока не знаю) с 0 на 1 в зависимости от значения в {-Variable.position_side-}, где 0 это Buy, а 1 это Sell.
C#:
Развернуть Свернуть Копировать
int side;
//определю массив, данные из которого нужно взять
switch(project.Variables["position_side"].Value){
    case "Buy":  { side = 0; break; }
    case "Sell": { side = 1; break; }
    default:throw new Exception(@"Неожидаемое значение переменной ""position_side"":  ");
}
//парсим json
project.Json.FromString(project.Variables["position_json"].Value);
//берем нужное св-во в переменную
project.Variables["position_pnl"].Value = Convert.ToString(project.Json.result[side].unrealised_pnl).Replace(",",".");
project.Variables["position_margin"].Value = Convert.ToString(project.Json.result[side].position_margin).Replace(",",".");
project.Variables["position_side"].Value = Convert.ToString(project.Json.result[side].side);
project.Variables["tmp_signal_old"].Value = Convert.ToString(project.Json.result[side].side);
project.Variables["position_size"].Value = Convert.ToString(project.Json.result[side].size);
project.Variables["position_simbol"].Value = Convert.ToString(project.Json.result[side].symbol);
project.Variables["position_entry_price"].Value = Convert.ToString(project.Json.result[side].entry_price).Replace(",",".");
project.Variables["position_json_utime"].Value = Convert.ToString(project.Json.time_now);
 
  • Спасибо
Реакции: nik-n, vedi108 и BAZAg
Так просто собирайте данные в таблицу, а дальше уже делайте с ними все что считаете нужным.
Вот пример:
C#:
Развернуть Свернуть Копировать
string json = project.Variables["json"].Value;
project.Json.FromString(json);
var tb = project.Tables["tb"];
if(project.Json.result.Count > 0) {
    project.SendInfoToLog(string.Format(@"Найдено столько-то результатов: {0}", project.Json.result.Count));
    for(int i = 0;i<project.Json.result.Count;i++) {
        string[] row = new string[25];
        var item = project.Json.result[i]; // взяли элемент с массива
        row[0] = item.user_id != null ? item.user_id.ToString() : string.Empty;
        row[1] = item.symbol != null ? item.symbol.ToString() : string.Empty;
        row[2] = item.side != null ? item.side.ToString() : string.Empty;
        row[3] = item.size != null ? item.size.ToString() : string.Empty;
        row[4] = item.position_value != null ? item.position_value.ToString() : string.Empty;
        row[5] = item.entry_price != null ? item.entry_price.ToString() : string.Empty;
        row[6] = item.liq_price != null ? item.liq_price.ToString() : string.Empty;
        row[7] = item.bust_price != null ? item.bust_price.ToString() : string.Empty;
        row[8] = item.leverage != null ? item.leverage.ToString() : string.Empty;
        row[9] = item.auto_add_margin != null ? item.auto_add_margin.ToString() : string.Empty;
        row[10] = item.is_isolated != null ? item.is_isolated.ToString() : string.Empty;
        row[11] = item.position_margin != null ? item.position_margin.ToString() : string.Empty;      
        row[12] = item.occ_closing_fee != null ? item.occ_closing_fee.ToString() : string.Empty;
        row[13] = item.realised_pnl != null ? item.realised_pnl.ToString() : string.Empty;
        row[14] = item.cum_realised_pnl != null ? item.cum_realised_pnl.ToString() : string.Empty;
        row[15] = item.free_qty != null ? item.free_qty.ToString() : string.Empty;
        row[16] = item.tp_sl_mode != null ? item.tp_sl_mode.ToString() : string.Empty;      
        row[17] = item.unrealised_pnl != null ? item.unrealised_pnl.ToString() : string.Empty;
        row[18] = item.deleverage_indicator != null ? item.deleverage_indicator.ToString() : string.Empty;
        row[19] = item.risk_id != null ? item.risk_id.ToString() : string.Empty;
        row[20] = item.stop_loss != null ? item.stop_loss.ToString() : string.Empty;      
        row[21] = item.take_profit != null ? item.take_profit.ToString() : string.Empty;
        row[22] = item.trailing_stop != null ? item.trailing_stop.ToString() : string.Empty;
        row[23] = item.position_idx != null ? item.position_idx.ToString() : string.Empty;
        row[24] = item.mode != null ? item.mode.ToString() : string.Empty;      
        if(!string.IsNullOrEmpty(row[2])) tb.AddRow(row);      
    }
}
Посмотреть вложение 99243
Спасибо за код , сильно пригодился
 
  • Спасибо
Реакции: BAZAg
GEMINI API выдает результат json в котором контент разделен по нескольким частям, C# соединяет контент
Пример JSON
JSON:
Развернуть Свернуть Копировать
[{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "Lorem ipsum blablabla11111111111111111"
          }
        ],
        "role": "model"
      },
      "index": 0
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 1470,
    "candidatesTokenCount": 59,
    "totalTokenCount": 1529,
    "promptTokensDetails": [
      {
        "modality": "TEXT",
        "tokenCount": 1470
      }
    ]
  },
  "modelVersion": "gemini-2.5-pro-exp-03-25"
}
,
{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "Lorem ipsum blablabla222222222222222222222222222"
          }
        ],
        "role": "model"
      },
      "finishReason": "STOP",
      "index": 0
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 1470,
    "candidatesTokenCount": 96,
    "totalTokenCount": 1566,
    "promptTokensDetails": [
      {
        "modality": "TEXT",
        "tokenCount": 1470
      }
    ]
  },
  "modelVersion": "gemini-2.5-pro-exp-03-25"
}
]
Сниппет C#
C#:
Развернуть Свернуть Копировать
string json = project.Variables["gemini_json"].Value;
project.Json.FromString(json);

var sb = new StringBuilder();
int count = (int)project.Json.Count;

for (int i = 0; i < count; i++)
{
    try
    {
        string rawText = project.Json[i].candidates[0].content.parts[0].text;
        if (!string.IsNullOrEmpty(rawText))
        {
            // Декодируем JSON-спецсимволы и обрезаем пробелы
            string processedText = System.Text.RegularExpressions.Regex.Unescape(
                rawText.TrimStart()  // Сохраняем концевые пробелы для форматирования
            );
        
            // Соединяем фрагменты, убирая только начальные пробелы у последующих частей
            if (sb.Length > 0 && !char.IsWhiteSpace(sb[sb.Length - 1]))
            {
                sb.Append(' ');
            }
            sb.Append(processedText);
        }
    }
    catch { }
}

// Постобработка для сохранения оригинального форматирования
string result = sb.ToString()
    .Replace("\r\n", "\n")  // Нормализуем переводы строк
    .Replace(" \n", "\n")   // Чистим пробелы перед переносами
    .Replace("\n ", "\n");  // Чистим пробелы после переносов

//project.Variables["gemini_content"].Value = result;
return result;

Пару кеев для поиска по форуму: google, aistudio, gemini api, соединить склеить части из json
 
Последнее редактирование:
  • Спасибо
Реакции: Sergeevich68

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)