Как преобразовать Newtonsoft. Json .Linq.Array в массив double? - PullRequest
0 голосов
/ 27 января 2020

У меня есть объект Newtonsoft.Linq. Json .Array, который я получил после запуска камеры, и строка получена на мой ноутбук через TCP / IP. Используемый код показан ниже:

public async void ReadDataAsync(TcpClient mClient)
{
    try
    {
        StreamReader clientStreamReader = new StreamReader(mClient.GetStream());

        char [] buff = new char[1024];
        int readByCount = 0;            

        while (true)
        {
            readByCount = await clientStreamReader.ReadAsync(buff, 0, buff.Length);

            Directory.CreateDirectory("Camera o3D1");

            if (readByCount <= 0)
            {
                Console.WriteLine("Disconnected from Server.");
                mClient.Close();
                break;
            }

            if (readByCount > 30)
            {
                var output = (new string(buff).TrimEnd('\u0000'));
                Console.WriteLine(output);                    

                Console.WriteLine(output.GetType());
                var output1 = output.Split(new[] { ";;" }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Split(';')).ToArray();

                JToken jsonParsed = JToken.FromObject(output1);
                Console.WriteLine(jsonParsed);
                Console.WriteLine(jsonParsed.GetType());
            }


                //File.WriteAllLines("Camera o3D1/file.json", jsonParsed);
                //File.AppendAllText("Camera o3D1/file.json", type);                

            Array.Clear(buff, 0, buff.Length);
        }

    }
    catch (Exception excp)
    {
        Console.WriteLine(excp.ToString());
    }
}

Я получил вывод:

 [
  [
    "17.623665",
    "87.380157",
    "51.530350",
    "121.286850",
    "+0.480"
  ],
  [
    "89.199364",
    "47.660252",
    "123.106056",
    "81.566940",
    "+0.521"
  ],
  [
    "\r\n"
  ]
]

Newtonsoft. Json .Linq.JArray

Я хочу преобразовать его в массив double, чтобы, если бы я использовал jsonparsed[0], я должен был получить

[
    "17.62",
    "87.38",
    "51.53",
    "121.28",
    "+0.48"
 ]

и jsonparsed[0][0], я должен получить 17,62 и все в двойном числе. Кто-нибудь из вас знает, как это сделать?

Ответы [ 2 ]

1 голос
/ 27 января 2020

Вам нужно решить две проблемы:

  • Данные не являются плоским массивом. Вместо этого это массив массивов значений типа double.
  • Некоторые из вас являются недопустимыми значениями double, и вам нужно решить, что с ними произойдет.

Итак, давайте сначала решим самая внутренняя проблема, которая будет преобразование значений в удваивается. В связи с тем, что вы используете Newtonsoft, вы можете написать свой собственный конвертер и передать его в сериализатор:

public class SpecialDoubleConverter : JsonConverter<double>
{
    public override double ReadJson(JsonReader reader, Type objectType, double existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var rawValue = (string)reader.Value;

        // Decide what should be returned if the value can not be read as double
        // e.g. return some magic value like -17, double.NaN, 0, double.Epsilon, etc.
        return double.TryParse(rawValue, out double result)
            ? result
            : -17;
    }

    public override void WriteJson(JsonWriter writer, double value, JsonSerializer serializer)
    {
        // Writing a double into a json string is the same as the default.
        writer.WriteValue(value.ToString());
    }
}

Если вы используете этот сериализатор, вы можете получить вложенный массив с помощью этого вызова:

var jsonParsed = JsonConvert.DeserializeObject<List<List<double>>>(output1, new SpecialDoubleConverter());

Теперь нам нужно сгладить этот вложенный список, чего можно добиться с помощью LINQ:

var doubleValues = jsonParsed.SelectMany(list => list).ToList();
1 голос
/ 27 января 2020

Вы можете попробовать что-то вроде этого:

   var input = $"[[\"17.623665\",\"87.380157\",\"51.530350\",\"121.286850\",\"+0.480\"],[\"89.199364\",\"47.660252\",\"123.106056\",\"81.566940\",\"+0.521\"]]";

            var jarray = JsonConvert.DeserializeObject<JArray>(input);
            foreach (var arrayItem in jarray)
            {
                var innerArray = arrayItem.ToObject<double[]>();

                foreach (var item in innerArray)
                {
                    Console.WriteLine(item);
                }

            }

Сначала вам придется отфильтровать последний пустой элемент:

  [
    "\r\n"
  ]

"\ r \ n" не десериализуется в двойной ..

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