* DateTime in JSON "\/Date(Ticks)\/" * Ticks Millisekunden (Int64) seit 01.01.1970 00:00:00 UTC * Maximalwert MaxValue (12/31/9999 11:59:59 PM) * Minimalwert MinValue (1/1/0001 12:00:00 AM)
Weiterführende Infos: Link
* DateTime in JSON "\/Date(Ticks)\/" * Ticks Millisekunden (Int64) seit 01.01.1970 00:00:00 UTC * Maximalwert MaxValue (12/31/9999 11:59:59 PM) * Minimalwert MinValue (1/1/0001 12:00:00 AM)
Weiterführende Infos: Link
* XML URL/SERVICENAME/ZENTITYSet(Var1='1')?$format=xml * ATOM URL/SERVICENAME/ZENTITYSet(Var1='1')?$format=atom * JSON URL/SERVICENAME/ZENTITYSet(Var1='1')?$format=json * XLSX URL/SERVICENAME/ZENTITYSet(Var1='1')?$format=xlsx
SELECT * FROM sflight INTO TABLE @DATA(it_flight).
* ABAP->JSON
DATA(lv_json) = /ui2/cl_json=>serialize( data = it_flight
compress = abap_true
pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).
WRITE: / lv_json.
DATA: it_flight_json TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
* JSON->ABAP
/ui2/cl_json=>deserialize( EXPORTING
json = lv_json
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
CHANGING
data = it_flight_json ).
* ABAP object ->JSON
DATA(o_descr) = cl_abap_typedescr=>describe_by_data( it_flight_json ).
DATA(lv_json2) = /ui2/cl_json=>serialize( o_descr ).
WRITE: / lv_json2.
Weiterführende Infos: Link
DATA: json type string VALUE '[{name: "Horst", title: "Herr", age: "30 "}, {name: "Jutta", title: "Frau", age: "35 "}, {name: "Ingo", title: "Herr", age: "31 "}]'.
TYPES: BEGIN OF s_person,
name TYPE string,
title TYPE string,
age TYPE i,
END OF s_person.
TYPES: t_person TYPE STANDARD TABLE OF s_person WITH DEFAULT KEY.
DATA(it_persons) = VALUE t_person( ).
* JSON (trex) -> ABAP (iTab)
DATA(o_trex) = NEW cl_trex_json_deserializer( ).
o_trex->deserialize( EXPORTING json = json
IMPORTING abap = it_persons ).
IF lines( it_persons ) > 0.
WRITE: / it_persons[ 1 ]-name.
ENDIF.
JSON-Daten liegen in einem eigenen Format vor. Um dieses Datenformat in C# abzubilden benötigt man zuerst eine oder mehrere Klassen. Der Einfachheit halber kann man sich auf der Seite http://json2csharp.com/ aus dem JSON-Datenformat automatisiert C#-Klassen bauen lassen.
Als Beispiel dient folgende JSON-Datei:
{
"SerialNumber": "05857628",
"DateTime": "1415783932",
"Meters": [{
"InputNumber": "1",
"Name": "HZ Wirkleistung BZ 90612021",
"Type": "Electricity",
"Value": 2092224.000,
"Unit": "Wirkleistung"
},
{
"InputNumber": "2",
"Name": "HZ Blindleistung BZ 90612021",
"Type": "Electricity",
"Value": 2093763.500,
"Unit": "Blindleistung"
},
]
}
Die zugehörigen C#-Klassen sehen wie folgt aus:
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace JSONTest
{
[DataContract]
public class Meter
{
[DataMember]
public string InputNumber { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Type { get; set; }
[DataMember]
public double? Value { get; set; }
[DataMember]
public string Unit { get; set; }
}
[DataContract]
public class Meter_List
{
[DataMember]
public string SerialNumber { get; set; }
[DataMember]
public string DateTime { get; set; }
[DataMember]
public List<Meter-> Meters { get; set; }
}
}
Im Code greift man nun folgendermaßen auf die Daten zu:
// im Projektbaum Verweis hinzufügen: System.Runtime.Serialization
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
private void btnGetJSON_Click(object sender, EventArgs e)
{
// JSON-File von URL holen
string contents = new System.Net.WebClient().DownloadString("www.datenquelle.de");
// JSON deserialisieren
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Meter_List));
MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(contents));
Meter_List obj = (Meter_List)ser.ReadObject(stream);
// Daten ausgeben
Console.WriteLine(obj.SerialNumber);
Console.WriteLine(obj.Meters.Count);
Console.WriteLine(obj.Meters[0].Name);
}