Страницы

Поиск по вопросам

Показаны сообщения с ярлыком json-encode. Показать все сообщения
Показаны сообщения с ярлыком json-encode. Показать все сообщения

пятница, 10 января 2020 г.

Русская кодировка json объекта (python)

#python #json #encoding #json_encode


При попытке форматированного вывода JSON, с помощью dump, перестают отображаться
русские символы. Появляется что-то типа ""(произвольное поле, например)Address": "\u0443\u043b\u0438\u0446\u0430
\u041c\u0430 и т. д."

Пробовал json.dumps().encode("utf8") и codac convert - ничего не помогает.

def load_data(filepath):
with open(filepath, 'r', encoding='utf-8') as fh:  
    data = json.load(fh)  # загружаем из файла данные в словарь data
    return data


def pretty_print_json(data):
 inf = json.dumps(data,sort_keys=False,indent=4, separators=(',', ': '))
 return inf    

    


Ответы

Ответ 1



Воспользуйтесь параметром ensure_ascii=False: Из документации: If ensure_ascii is true (the default), the output is guaranteed to have all incoming non-ASCII characters escaped. If ensure_ascii is false, these characters will be output as-is. Пример: In [41]: with open(fn, 'r', encoding='utf-8') as f: ...: data = json.load(f) ...: ...: print(json.dumps(data, ...: sort_keys=False, ...: indent=4, ...: separators=(',', ': '))) ...: { "\u043f\u0440\u0438\u043c\u0435\u0440": { "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a": "\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043b\u043e\u0432\u0430\u0440 \u044f", "\u0441\u043f\u0438\u0441\u043e\u043a": [ "\u044d\u043b\u0435\u043c\u0435\u043d\u0442 1", "\u044d\u043b\u0435\u043c\u0435\u043d\u0442 2" ] } } In [42]: print(json.dumps(data, ...: sort_keys=False, ...: indent=4, ...: ensure_ascii=False, ...: separators=(',', ': '))) ...: { "пример": { "Заголовок": "пример словаря", "список": [ "элемент 1", "элемент 2" ] } } JSON file: { "пример": { "Заголовок": "пример словаря", "список": ["элемент 1", "элемент 2"] } }

четверг, 12 декабря 2019 г.

Json как парсить на Java?

#java #json #синтаксический_анализ #json_encode


Здравствуйте!
Есть вот такой ответ от сервера: 

 {
    "p_result": "ok",
    "p_item": [
        {
            "p_id": 132,
            "p_name": "Николай"
        }, 
        {
            "p_id": 133,
            "p_name": "Светлана"
        }
    ]
 }


Если правильно понимаю, то это массив.
Нужно написать метод который будет по параметру находить нужный элемент
что то наподобие : 

_http.getArrayParamValue("p_name");


Никак не могу сообразить.

p.s. думаю для меня было бы полезнее некое указание, нежели ссылка на очерендую библиотеку.
Спасибо!

Решение. Ошибку тоже понял. @Josfey Спасибо огромное. Вы очень мне помогли! 

String str = null; 
String input = "данные полученные от сервера"; 

JsonParser parser = new JsonParser(); 
JsonObject mainObject = parser.parse(input).getAsJsonObject();
JsonArray pItem = mainObject.getAsJsonArray("p_item"); 

for (JsonElement user : pItem) {

    JsonObject userObject = user.getAsJsonObject(); 
    userObject.get("p_id"); 
    str = userObject.get("p_id").toString(); 
}

    


Ответы

Ответ 1



Не совсем понял, что именно вы хотите извлечь из приведённой json-структуры, но вот, например, как извлечь из неё имя пользователя c id = 132 с помощью GSON. String input = "тут ваша json-структура"; JsonParser parser = new JsonParser(); JsonObject mainObject = parser.parse().getAsJsonObject(); JsonArray pItem = mainObject.getAsJsonArray("p_item"); for (JsonElement user : pItem) { JsonObject userObject = user.getAsJsonObject(); if (userObject.get("p_id").getAsInt() == 132) { System.out.println(userObject.get("p_name")); return; } }

Ответ 2



На мой взгляд, самая лучшая на данный момент библиотека для работы с JSON - это Jackson от fasterxml. Измерял скорость сериализации/десериализации с помощью JMH, и эта библиотека показала наилучшие результаты на довольно сложной структуре данных. Кроме того, она имеет довольно богатый набор настроек: интернирование ключей, реакция на ошибки синтаксиса и т.п. Если вы хотите не просто сериализовывать/десериализовывать JSON-документы, а хотите менять структуру JSON-документа на лету, то рекомендую GSON.

Ответ 3



Рекомендую обратить внимание на json-simple Вот тут пример использования

понедельник, 15 июля 2019 г.

Как распарсить JavaScript Object (не валидный JSON) в Golang?

Вначале валидный JSON:
v1 := `{ "middle" : { "src": "pictures/product/middle/14906_middle.jpg", "place" : "#preview-img", "title": "343880-090-slantsy-nike-benassi-just-do-it" } }`
Теперь валидный JavaScript Object, но не валидный JSON:
v2 := `{ middle : { src: 'pictures/product/middle/14906_middle.jpg', place : '#preview-img', title: '343880-090-slantsy-nike-benassi-just-do-it' } }`
Подскажите как распарсить второй вариант? Обычный encoding.json.Unmarshal() ругается на невалидность.
error: invalid character 'm' looking for beginning of object key string
Может быть есть какая-то библиотека в которой этот нюанс можно настроить?
Update:
Можно запустить VM https://github.com/robertkrimen/otto и передав ей немного дополненный текст получить из неё нужное поле.
package main
import ( "testing" "github.com/robertkrimen/otto" )
func BenchmarkVMGet(b *testing.B) { vm := otto.New()
b.ResetTimer() for i := 0; i < b.N; i++ { st := ` { middle : { src: 'pictures/product/middle/14906_middle.jpg', place : '#preview-img', title: '343880-090-slantsy-nike-benassi-just-do-it' } } `
vm.Run(` obj = `+st+` src = obj.middle.src; `) src, err := vm.Get("src") // <----- _ = src _ = err } }
# go test -bench=".*" ottotest testing: warning: no tests to run PASS BenchmarkVMGet 30000 58103 ns/op ok ottotest 2.367s
Однако есть минусы:
может прилететь произвольный кусок текста и выполнять его бездумно не правильно (вспомним eval в php) достаточно медленно используется очень большая библиотека - плохая зависимость
Плюсы:
всё таки достаточно быстро можно не останавливать VM, а пушить туда через Run, но если пушить бесконечно остаётся вопрос - умрёт однажды или не умрёт - без хорошего знания внутренностей библиотеки сказать этого заранее нельзя
Я всё ещё ищу другие варианты, чисто под задачу распарсить object и не выполнять лишних операций.


Ответ

Есть библиотека для этого launchpad.net/rjson. Если ключ соответствует регулярному выражению
[a-zA-Z][a-zA-Z0-9\-_]*
Обращаю внимание, что в JavaScript символ $ может быть использован - а здесь нет.
Однако launchpad.net/rjson не поддерживает одинарные кавычки в значениях. Что бы это поправить был сделан форк который можно взять вот тут: github.com/mantyr/rjson

четверг, 18 октября 2018 г.

Json как парсить на Java?

Здравствуйте! Есть вот такой ответ от сервера:
{ "p_result": "ok", "p_item": [ { "p_id": 132, "p_name": "Николай" }, { "p_id": 133, "p_name": "Светлана" } ] }
Если правильно понимаю, то это массив. Нужно написать метод который будет по параметру находить нужный элемент что то наподобие :
_http.getArrayParamValue("p_name");
Никак не могу сообразить.
p.s. думаю для меня было бы полезнее некое указание, нежели ссылка на очерендую библиотеку. Спасибо!
Решение. Ошибку тоже понял. @Josfey Спасибо огромное. Вы очень мне помогли!
String str = null; String input = "данные полученные от сервера";
JsonParser parser = new JsonParser(); JsonObject mainObject = parser.parse(input).getAsJsonObject(); JsonArray pItem = mainObject.getAsJsonArray("p_item");
for (JsonElement user : pItem) {
JsonObject userObject = user.getAsJsonObject(); userObject.get("p_id"); str = userObject.get("p_id").toString(); }


Ответ

Не совсем понял, что именно вы хотите извлечь из приведённой json-структуры, но вот, например, как извлечь из неё имя пользователя c id = 132 с помощью GSON
String input = "тут ваша json-структура"; JsonParser parser = new JsonParser(); JsonObject mainObject = parser.parse().getAsJsonObject(); JsonArray pItem = mainObject.getAsJsonArray("p_item"); for (JsonElement user : pItem) { JsonObject userObject = user.getAsJsonObject(); if (userObject.get("p_id").getAsInt() == 132) { System.out.println(userObject.get("p_name")); return; } }