Как обрабатывать внутренний Json при использовании JsonOutputter

Я конвертирую некоторые файлы csv в Json, используя JsonOutputter. В файлах csv у меня есть поле, содержащее Json, подобное этому (символ вертикальной черты является разделителем): ...|{ "type": "Point", "coordinates": [ 18.7726, 74.5091 ] }|...

При выводе в Json результат выглядит так: «Местоположение»: «{ \"тип\":\"Точка\", \"координаты\":[ 18.7726, 74.5091 ] }"

Я хотел бы избавиться от внешних кавычек, чтобы Json выглядел так: «Местоположение»: { «тип»: «Точка», «координаты»: [18.7726, 74.5091]}

Каков наилучший способ добиться этого? Выходной Json будет храниться в Cosmos DB, поэтому я предполагаю, что «очистка» Json может быть выполнена либо в U-SQL, либо в Cosmos DB?


person Magnus Johannesson    schedule 28.06.2017    source источник


Ответы (2)


Средство вывода образца генерирует только плоский JSON. Поскольку у нас нет типа данных JSON, любое строковое значение должно быть экранировано, чтобы оно стало строковым значением.

Вы можете написать свой собственный модуль вывода, который, например, принимает экземпляры SqlMap для вложенных значений и выводит их как вложенные JSON, или, если вы знаете, что некоторые строки в наборах строк на самом деле являются JSON, а не просто строками, сериализуйте их без кавычек.

person Michael Rys    schedule 29.06.2017
comment
Спасибо. Я обновил образец JsonOutputter и сериализовал столбец JSON как необработанный JSON. - person Magnus Johannesson; 04.07.2017

Если JsonOutputter не является единственным выбором для этого, мы можем преобразовать файл csv в Json с помощью нашего пользовательского кода. Я тестирую его со следующим файлом csv.

number|Location
1|{ "type":"Point", "coordinates":[ 13.7726, 73.5091 ] }
2|{ "type":"Point", "coordinates":[ 14.7726, 74.5091 ] }

Пожалуйста, попробуйте использовать следующий код, он работает правильно на моей стороне.

 var lines = File.ReadAllText(@"C:\Tom\tomtest.csv").Replace("\r", "").Split('\n');
            var csv = lines.Select(l => l.Split('|')).ToList();

            var headers = csv[0];
            var dicts = csv.Skip(1).Select(row => headers.Zip(row, Tuple.Create).ToDictionary(p => p.Item1, p => p.Item2)).ToArray().Select(x=>new
            {
                number = x["number"],
                location = JObject.Parse(x["Location"])
            });

            string json = JsonConvert.SerializeObject(dicts);
            Console.WriteLine(json);

Результат испытаний:

введите здесь описание изображения

person Tom Sun - MSFT    schedule 29.06.2017