none
JSON String auswertung funktioniert nur einmal RRS feed

  • Frage

  • hallo,

    ich lasse meinen JSON String auswerten. Dies funktioniert auch beim ersten mal, nur nach dem ersten mal nicht mehr.

    Wenn ich den Code ausführe und den Namen zum ertsen Mal auslese, dann funktioniert es perfekt. Ändere ich dann den Namen auf dem Server, dann steht der geänderte Name auch in dem JSON string, Nur leider wird er nicht weiterverarbeitet.

    Hier der Code:

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using Windows.Data.Json; using System.Runtime.Serialization.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using System.Net; // Die Elementvorlage "Leere Seite" ist unter http://go.microsoft.com/fwlink/?LinkId=391641 dokumentiert. namespace FHEM { /// <summary> /// Eine leere Seite, die eigenständig verwendet werden kann oder auf die innerhalb eines Rahmens navigiert werden kann. /// </summary> public sealed partial class MainPage : Page { HttpClient client = new HttpClient(); HttpResponseMessage response = new HttpResponseMessage(); private string Link = "http://XXX:XXX/fhem?cmd=jsonlist2 Lampe&XHR=1"; public MainPage() { this.InitializeComponent(); this.NavigationCacheMode = NavigationCacheMode.Required; // Senden string _auth = string.Format("{0}:{1}", "XXX", "XXX"); string _enc = Convert.ToBase64String(Encoding.UTF8.GetBytes(_auth)); string _basic = string.Format("{0} {1}", "Basic", _enc); client.DefaultRequestHeaders.Add("Authorization", _basic); } private async void Button_Click(object sender, RoutedEventArgs e) { Status.Text = "Test if URI is valid"; Uri resourceUri; if (!Uri.TryCreate(Link, UriKind.Absolute, out resourceUri)) { Status.Text = "Invalid URI, please re-enter a valid URI"; return; } if (resourceUri.Scheme != "http" && resourceUri.Scheme != "https") { Status.Text = "Only 'http' and 'https' schemes supported. Please re-enter URI"; return; } string responseBodyAsText; Status.Text = "Waiting for response ..."; var json_data = string.Empty; try { response = await client.GetAsync(Link); response.EnsureSuccessStatusCode(); responseBodyAsText = await response.Content.ReadAsStringAsync(); } catch (Exception ex) { // Need to convert int HResult to hex string Status.Text = "Error = " + ex.HResult.ToString("X") + " Message: " + ex.Message; responseBodyAsText = ""; } Status.Text = response.StatusCode + " " + response.ReasonPhrase; // Format the HTTP response to display better responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine); Status.Text = responseBodyAsText; Status.Text = ""; FHEM_Test m = JsonConvert.DeserializeObject<FHEM_Test>(responseBodyAsText); Status.Text = m.Results[ 0 ].Name;

    } } public class FHEM_Test { public string __invalid_name__00 { get; set; } public string CFGFN { get; set; } public string DEF { get; set; } public string NAME { get; set; } public string NR { get; set; } public string STATE { get; set; } public string TYPE { get; set; } public string XMIT { get; set; } public string XMITdimdown { get; set; } public string XMITdimup { get; set; } public string XMITon { get; set; } } public class Protocol { public string Value { get; set; } public string Time { get; set; } } public class State { public string Value { get; set; } public string Time { get; set; } } public class Readings { public Protocol protocol { get; set; } public State state { get; set; } } public class Attributes { public string IODev { get; set; } public string group { get; set; } public string room { get; set; } public string sortby { get; set; } public string yaf_1 { get; set; } } public class Result { public string Name { get; set; } public string PossibleSets { get; set; } public string PossibleAttrs { get; set; } public FHEM_Test Internals { get; set; } public Readings Readings { get; set; } public Attributes Attributes { get; set; } } public class RootObject { public string Arg { get; set; } public List<Result> Results { get; set; } public int totalResultsReturned { get; set; } } }

    Wo liegt das Problem?

    Vielen Dank im voraus

    arokh12

    Samstag, 24. Oktober 2015 18:45

Antworten

Alle Antworten

  • Hi,

    steht im ersten Element von Results in der dortigen Eigenschaft "Name" wirklich der neue Name des Elements?

    Poste doch mal bitte die JSON Rückgabe des ersten Aufrufs und dann die Rückgabe des zweiten Aufrufs, nachdem Du den Namen geändert hast.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 24. Oktober 2015 19:21
    Moderator
  • Hi,

    steht im ersten Element von Results in der dortigen Eigenschaft "Name" wirklich der neue Name des Elements?

    Poste doch mal bitte die JSON Rückgabe des ersten Aufrufs und dann die Rückgabe des zweiten Aufrufs, nachdem Du den Namen geändert hast.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Hallo,

    hatte heute leider erst wieder zeit. Hier ist der Json Code vor der Änderung:

    "{\n  \"Arg\":\"Strasse_Beleuchtung_Einzelgarage\",\n  \"Results\": [\n  {\n    \"Name\":\"Strasse_Beleuchtung_Einzelgarage\",\n    \"PossibleSets\":\"off off-for-timer on on-for-timer reset timer toggle on-till on-till-overnight blink off-till-overnight intervals off-till\",\n    \"PossibleAttrs\":\"verbose:0,1,2,3,4,5 room group comment:textField-long alias eventMap userReadings IODev follow-on-for-timer:1,0 follow-on-timer do_not_notify:1,0 ignore:1,0 dummy:1,0 showtime:1,0 event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat model:dummyDimmer,dummySender,dummySimple,fs20as1,fs20as4,fs20bf,fs20bs,fs20di,fs20di10,fs20du,fs20fms,fs20hgs,fs20irl,fs20kse,fs20ls,fs20ms2,fs20pira,fs20piri,fs20piru,fs20rgbsa,fs20rst,fs20rsu,fs20s16,fs20s20,fs20s4,fs20s4a,fs20s4m,fs20s4u,fs20s4ub,fs20s8,fs20s8m,fs20sa,fs20sd,fs20si3,fs20sig,fs20sm4,fs20sm8,fs20sn,fs20sr,fs20ss,fs20st,fs20st2,fs20str,fs20su,fs20sv,fs20tc1,fs20tc6,fs20tfk,fs20tk,fs20ue1,fs20usr,fs20uts,fs20ws1,fs20ze cmdIcon devStateIcon devStateStyle icon sortby webCmd widgetOverride yaf_1 yaf_3 yaf_4 yaf_5 yaf_6 yaf_7 yaf_8 userattr\",\n    \"Internals\": {\n      \"BTN\": \"00\",\n      \"CFGFN\": \"/opt/fhem/FHEM/Aussen.cfg\",\n      \"DEF\": \"12341234 1111\",\n      \"NAME\": \"Strasse_Beleuchtung_Einzelgarage\",\n      \"NR\": \"246\",\n      \"STATE\": \"off\",\n      \"TYPE\": \"FS20\",\n      \"XMIT\": \"1b1b\"\n    },\n    \"Readings\": {      \"state\": { \"Value\":\"off\", \"Time\":\"2015-10-29 20:42:17\" }    },\n    \"Attributes\": {\n      \"IODev\": \"CUL868\",\n      \"alias\": \"Beleuchtung Einzelgarage\",\n      \"group\": \"Straße\",\n      \"model\": \"fs20as4\",\n      \"room\": \"Außen\"\n    }\n  }  ],\n  \"totalResultsReturned\":1\n}\n\n"

    und hier danach:

    "{\n  \"Arg\":\"Strasse_Beleuchtung_Einzelgarage\",\n  \"Results\": [\n  {\n    \"Name\":\"Strasse_Beleuchtung_Einzelgarage\",\n    \"PossibleSets\":\"off off-for-timer on on-for-timer reset timer toggle on-till on-till-overnight blink off-till-overnight intervals off-till\",\n    \"PossibleAttrs\":\"verbose:0,1,2,3,4,5 room group comment:textField-long alias eventMap userReadings IODev follow-on-for-timer:1,0 follow-on-timer do_not_notify:1,0 ignore:1,0 dummy:1,0 showtime:1,0 event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat model:dummyDimmer,dummySender,dummySimple,fs20as1,fs20as4,fs20bf,fs20bs,fs20di,fs20di10,fs20du,fs20fms,fs20hgs,fs20irl,fs20kse,fs20ls,fs20ms2,fs20pira,fs20piri,fs20piru,fs20rgbsa,fs20rst,fs20rsu,fs20s16,fs20s20,fs20s4,fs20s4a,fs20s4m,fs20s4u,fs20s4ub,fs20s8,fs20s8m,fs20sa,fs20sd,fs20si3,fs20sig,fs20sm4,fs20sm8,fs20sn,fs20sr,fs20ss,fs20st,fs20st2,fs20str,fs20su,fs20sv,fs20tc1,fs20tc6,fs20tfk,fs20tk,fs20ue1,fs20usr,fs20uts,fs20ws1,fs20ze cmdIcon devStateIcon devStateStyle icon sortby webCmd widgetOverride yaf_1 yaf_3 yaf_4 yaf_5 yaf_6 yaf_7 yaf_8 userattr\",\n    \"Internals\": {\n      \"BTN\": \"00\",\n      \"CFGFN\": \"/opt/fhem/FHEM/Aussen.cfg\",\n      \"DEF\": \"12341234 1111\",\n      \"NAME\": \"Strasse_Beleuchtung_Einzelgarage\",\n      \"NR\": \"246\",\n      \"STATE\": \"off\",\n      \"TYPE\": \"FS20\",\n      \"XMIT\": \"1b1b\"\n    },\n    \"Readings\": {      \"state\": { \"Value\":\"off\", \"Time\":\"2015-10-29 20:42:17\" }    },\n    \"Attributes\": {\n      \"IODev\": \"CUL868\",\n      \"alias\": \"Beleuchtung Einzelgarage\",\n      \"group\": \"Straße\",\n      \"model\": \"fs20as4\",\n      \"room\": \"Außen\"\n    }\n  }  ],\n  \"totalResultsReturned\":1\n}\n\n"

    Name müsste jetzt Test sein. Leider ist das nicht so. Wenn ich den Link im Browser aufrufe steht aber der aktuelle Name da.

    arokh12

    Freitag, 30. Oktober 2015 12:58
  • Hallo,

    es scheint, dass die Daten aus dem Cache gelesen werden. Das kann man umgehen, wenn man in HttpClient ein Filter für Cache setzt.

    public sealed partial class MainPage : Page { var httpFilter = new Windows.Web.Http.Filters.HttpBaseProtocolFilter(); httpFilter.CacheControl.ReadBehavior = Windows.Web.Http.Filters.HttpCacheReadBehavior.MostRecent; HttpClient client = new HttpClient(httpFilter); HttpResponseMessage response = new HttpResponseMessage();

    .....

     

    Hier wurde dieser Fall gut erklärt.

    Grüße

    Freitag, 30. Oktober 2015 13:52
  • Hallo,

    es scheint, dass die Daten aus dem Cache gelesen werden. Das kann man umgehen, wenn man in HttpClient ein Filter für Cache setzt.

    public sealed partial class MainPage : Page { var httpFilter = new Windows.Web.Http.Filters.HttpBaseProtocolFilter(); httpFilter.CacheControl.ReadBehavior = Windows.Web.Http.Filters.HttpCacheReadBehavior.MostRecent; HttpClient client = new HttpClient(httpFilter); HttpResponseMessage response = new HttpResponseMessage();

    .....

     

    Hier wurde dieser Fall gut erklärt.

    Grüße

    Leider kommt jetzt der Fehler:

    Die beste Übereinstimmung für die überladene System.Net.Http.HttpClient.HttpClient(System.Net.Http.HttpMessageHandler)-Methode hat einige ungültige Argumente.  

    Woran liegt das?

    arokh12

    Freitag, 30. Oktober 2015 14:15
  • Hallo,

    Oh, mein Fehler, das ist die Lösung für die App-Store Anwendungen (Windows  8).

    Für Windows Phone geht das über HttpRequestMessage, wie hier steht.

    Grüße



    Freitag, 30. Oktober 2015 14:46