Lazarus: чтение и разбор Json

Задача: прочитать Json с URL и распарсить его

Решение:

На неком удалённом ресурсе находится файл вида:

{
"error": false,
"result": [
{
"dt": "2023-01-16T10:49:14",
"url": "https://rfefe.грибовы.рф/?p=41",
"title": "Очень важное уведомление",
"text": "Олала",
"read": true
},
{
"dt": "2023-01-15T10:49:14",
"url": "https://erferf.грибовы.рф/?p=40",
"title": "Очень важное уведомление 2",
"text": "Олала 2",
"read": false
}
]
}

Сначала прочитаем файл в строку, а затем распарсим полученный json и переберем его в виде массива или выведем текст ошибки:

procedure TForm1.LoadJson(Sender: TObject);
var
  url, json : String;
  jsd: TJSONData;
  error : Boolean;
  Arr:TJSONData;
  i : integer;

begin
  url := 'http://ewrdfwerf.xn--90acbu5aj5f.xn--p1ai/get_events.php';
  Try
     json := TFPCustomHTTPClient.SimpleGet(url);
  Except
      json:='{"error": true,"result": "Ошибка получения данных"}';
  end;
  jsd:=GetJSON(json);
  error :=  jsd.FindPath('error').AsBoolean;
  if error=true then begin
    MessageDlg(jsd.FindPath('result').AsString, mtInformation,[mbOk],0);
  end;
  if error=false then
   begin
     for i:=0 to jsd.FindPath('result').Count-1 do
     begin
          MessageDlg(jsd.FindPath('result').Items[i].FindPath('title').AsString, mtInformation,[mbOk],0);
     end;
    end;
end;
  

Python: из объекта в JSON

Если применять json.dumps с объектом, то можно словить ошибку сериализации объекта. Для обхода этого можно применить следующий способ:

def serialize(obj):    
    return obj.__dict__
loc=json.dumps(loc, default=serialize)

В этом случае, если штатный сериализатор «не справляется», то ему будет передана «подсказка» о типе

Flutter: работа с json

В предыдущей статье мы получили по URL json данные. Теперь задача их обработать.

{
"UserId":10,
"UserName":"Vasya Pukin"
}

Для работы с json, необходимо импортировать библиотеку:

import 'dart:convert';

Далее загрузим данные в тип Map:

 Map<String, dynamic> user = jsonDecode(response.body);
                        print (user["UserName"]);

А что если это массив?

[
  {"UserId":10,"UserName":"Vasya Pukin 1"},
  {"UserId":10,"UserName":"Vasya Pukin 2"}
  ]

В этом случае загрузим JSON в объет List:

                        List users = jsonDecode(response.body);
                        for(int i=0; i < users.length; i++){
                          print(users[i]["UserName"]);
                        }

Обратная конвертация:

                        String json = jsonEncode(user);
                        print (json);

Android STUDIO: чтение JSON из URL

Задача: прочитать и пропарсить c URL ресурса JSON данные.

Как ни удивительно, такие тривиальные вещи в Android требуют кучу телодвижений. Возможно это сделано в угоду универсальности..но мне не понравилось от слова совсем. Плюс пришлось тянуть «стороннюю» библиотеку. Может быть конечно плохо гуглил.

Решение:

1) В build.grade добавим

implementation 'com.android.volley:volley:1.1.0'

2) Добавим класс..ну например ReadJsonAccounts:

package цукаука;

import android.content.Context;
import android.util.Log;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;

public class ReadJsonAccounts {
    public ReadJsonAccounts(Context context,String url) {
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>(){
                    @Override
                    public void onResponse(String response) {
                        try {
                            Log.i("Info", response);
                            JSONObject object = new JSONObject(EncodingToUTF8(response));
                            JSONArray jsonArray = object.getJSONArray("users");
                            ArrayList<JSONObject> listItems = getArrayListFromJSONArray(jsonArray);
                            // чтото делаем с получившимся JSON
                            if(jsonArray!= null){
                                for(int i = 0; i<jsonArray.length();i++){
                                    Log.i("Info", jsonArray.getJSONObject(i).getString("email"));
                                }
                            }
                        }catch (JSONException e){
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener(){
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(context,error.getMessage(),Toast.LENGTH_SHORT).show();
                    }
                });
        RequestQueue requestQueue = Volley.newRequestQueue(context);
        requestQueue.add(stringRequest);
    }
    public  static  String EncodingToUTF8(String response){
        try {
            byte[] code = response.toString().getBytes("ISO-8859-1");
            response = new String(code, "UTF-8");
        }catch (UnsupportedEncodingException e){
            e.printStackTrace();
            return null;
        }
        return response;
    }
    private ArrayList<JSONObject> getArrayListFromJSONArray(JSONArray jsonArray){
        ArrayList<JSONObject> aList = new ArrayList<JSONObject>();
        try {
            if(jsonArray!= null){
                for(int i = 0; i<jsonArray.length();i++){
                    aList.add(jsonArray.getJSONObject(i));
                }
            }
        }catch (JSONException js){
            js.printStackTrace();
        }
        return aList;
    }
}

3) Пример использования класса:

public class MainActivity extends AppCompatActivity {
    ReadJsonAccounts accounts;
    private static final String JSON_URL = "https://eй.seцйуайцуru/1.json";
    private Context cntcur;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        cntcur=this;
        // нажата кнопка "синхронизировать"
        Button button = (Button) findViewById(R.id.sync_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("Info", "--нажата кнопка Синхронизация");
                accounts = new ReadJsonAccounts(cntcur,JSON_URL);
            }
        });

1С: Преобразование данных в JSON. Вся боль и печаль.

К сожалению 1С не умеет преобразовывать абсолютно любые данные в формат JSON. Есть некоторые ограничения. Из тех которые мне попались: не умеет преобразовывать NULL, не умеет преобразовывать таблицы значений.

Как обхожу проблему NULL в запросах:

Как преобразовываю Таблицу Значений:

Вариант 1:

Вариант 2 (по сути «ручной» вариант первого варианта):




1 2