Как разобрать эту строку JSON в 2 списка

#c# #json #deserialization

#c# #json #десериализация

Вопрос:

У меня возникла некоторая проблема с пониманием того, как вы разбираете эту строку JSON. Как видно, у нас есть 2 списка в строке JSON. «предложения» и «запросы»

Для заявок, например, у нас есть:
0.035314,25.986,
0.035313,6.947
и т. Д

Целью является создание 2 списков, предложений и запросов, где каждый элемент в списке содержит вышеуказанное. Например, каждый индекс содержит эту информацию: «0.035314,25.986» и т.д.
Как можно подойти к этой строке при выполнении этого?

Ожидаемый результат должен быть таким, как показано ниже:

 List<String> bidsLIST = new List<String>();
List<String> asksLIST = new List<String>();
bidsLIST.Add("0.035314,25.986");
bidsLIST.Add("0.035313,6.947");

asksLIST .Add("0.035319,1.139");
asksLIST .Add("0.03532,28.381");
  

JSON находится здесь:
https://pastebin.com/j6Xckh49

 {"bids":[[0.035314,25.986],[0.035313,6.947],[0.035312,17.441],[0.035308,4],[0.0353,6.188]],"asks":[[0.035319,1.139],[0.03532,28.381],[0.035324,6.7],[0.035329,2.307],[0.03533,6.868]],"nonce":451939443}
  

Этот код не совсем корректен:

 using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
void testparseJSON()
{
    String responseBody = "{"  
                            '"'   "bids"   '"'   ":[[0.035314,25.986],[0.035313,6.947],[0.035312,17.441],[0.035308,4],[0.0353,6.188]],"  
                            '"'   "asks"   '"'   ":[[0.035319,1.139],[0.03532,28.381],[0.035324,6.7],[0.035329,2.307],[0.03533,6.868]],"  
                            '"'   "nonce"   '"'   ":451939443}";
    var deserializedTickers = JsonConvert.DeserializeObject<Dictionary<List<String>, bidsasks>>(responseBody);
    foreach (var bidsasks in deserializedTickers)
    {
        var Bids = bidsasks.Value.bids;
        var Asks = bidsasks.Value.asks;
        if (Bids != null amp;amp; Asks != null)
        {
            //How to get the 2 lists here?
        }
    }
}
public class bidsasks
{
    public List<String> bids { get; set; }
    public List<String> asks { get; set; }
}
  

Комментарии:

1. Посмотрите на свой объект Json. У него нет ключей типа List<String> (очевидно). Значения каждого ключа в вашем объекте Json представляют собой списки списков с числами (с плавающей запятой), которые, очевидно, вообще не соответствуют вашему bisasks классу. Вам нужно будет следовать структуре данных Json при использовании и / или создании классов / типов, которые соответствуют этой структуре, при попытке десериализации данных. Вы не можете просто создать и использовать какой-то класс несвязанной структуры и надеяться, что десериализатор угадает ваше намерение…

2. Если вам нужна помощь в разборе JSON, это действительно поможет, если вы опубликуете JSON, а не код, который объединяет строки для сборки JSON.

3. Да, я отредактировал сообщение с ожидаемым результатом и разместил JSON в pastebin

Ответ №1:

Вам нужен промежуточный класс для отражения структуры JSON:

 public class JsonBidsAsks {
    public List<List<string>> bids { get; set; }
    public List<List<string>> asks { get; set; }
}
  

Затем вы можете разобрать JSON и преобразовать в желаемую структуру:

 var deserializedTicker = JsonConvert.DeserializeObject<JsonBidsAsks>(responseBody);
var ans = new bidsasks {
    bids = deserializedTicker.bids.Select(ba => ba.Join(",")).ToList(),
    asks = deserializedTicker.asks.Select(aa => aa.Join(",")).ToList(),
};
  

Ответ №2:

     void testparseJSON(){

 String responseBody = "{"  
                                        '"'   "bids"   '"'   ":[[0.035314,25.986],[0.035313,6.947],[0.035312,17.441],[0.035308,4],[0.0353,6.188]],"  
                                        '"'   "asks"   '"'   ":[[0.035319,1.139],[0.03532,28.381],[0.035324,6.7],[0.035329,2.307],[0.03533,6.868]],"  
                                        '"'   "nonce"   '"'   ":451939443}";

                var jsnAsObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Rootobject>(responseBody);
                var bids = jsnAsObj.bids;
                var asks = jsnAsObj.asks;
}
  

и поместите в другой класс (рекомендуется в новый файл *.cs) свой DM.
это всего лишь предложение, а не обязательное, код может работать как внутренний класс внутри вашего текущего, но это не рекомендуется.

 public class Rootobject
    {
        public float[][] bids { get; set; }
        public float[][] asks { get; set; }
        public int nonce { get; set; }
    }
  

Комментарии:

1. Да, спасибо, тогда я понимаю. Я мог бы заставить это работать с помощью этого кода. Итак, вы ставите float[][], потому что это разделенный запятыми аргумент?

Ответ №3:

Вы можете десериализовать свой json до анонимного типа:

 var template = new
{
    bids = new[]
    {
        new[] {1.0, 1.0}
    },
    asks = new[]
    {
        new[] {1.0, 1.0}
    },
};

var parsedJson = JsonConvert.DeserializeAnonymousType(responseBody, template);
  

Теперь просто соедините bids и asks в двух списках:

 var bidsLIST = parsedJson.bids.Select(b => string.Join(",", b)).ToList();
var asksLIST = parsedJson.asks.Select(a => string.Join(",", a)).ToList();   
  

Ответ №4:

После проверки ответа @NetMage я немного изменил этот код и работает без проблем.

 public class bidsasks
{
    public List<List<string>> bids { get; set; }
    public List<List<string>> asks { get; set; }
    public int nonce { get; set; }

}
public static void testparseJSON()
{
    String responseBody = "{"  
                    '"'   "bids"   '"'   ":[[0.035314,25.986],[0.035313,6.947],[0.035312,17.441],[0.035308,4],[0.0353,6.188]],"  
                    '"'   "asks"   '"'   ":[[0.035319,1.139],[0.03532,28.381],[0.035324,6.7],[0.035329,2.307],[0.03533,6.868]],"  
                    '"'   "nonce"   '"'   ":451939443}";
        var deserializedTicker = JsonConvert.DeserializeObject<bidsasks>(responseBody);
        var ans = new bidsasks
        {
            bids = deserializedTicker.bids,
            asks = deserializedTicker.asks
        };
        for (int i = 0; i < ans.bids.Count; i  )
        {
            Console.WriteLine(String.Format("PRICE", ans.bids[i][0]));
            Console.WriteLine(String.Format("QTY", ans.bids[i][1]));
        }
        for (int i = 0; i < ans.asks.Count; i  )
        {
            Console.WriteLine(String.Format("PRICE", ans.asks[i][0]));
            Console.WriteLine(String.Format("QTY", ans.asks[i][1]));
        }
    }
}