0

I have this json:

{
  "f6a1ad82-4b5f-430d-92a0-817927f5beaa": [
    {
      "id": "5a9d3ae5fcf53960035643a7",
      "state": "RUNNING",
      "started_at": "2021-09-20T10:15:49.613Z",
      "detailed_message": null,
      "message_input": {
        "title": "Windows Event Logs",
        "global": true,
        "name": "GELF TCP",
        "content_pack": null,
        "created_at": "2018-03-05T12:48:16.447Z",
        "type": "org.graylog2.inputs.gelf.tcp.GELFTCPInput",
        "creator_user_id": "adminuser",
        "attributes": {
          "recv_buffer_size": 1048576,
          "tcp_keepalive": false,
          "use_null_delimiter": true,
          "tls_client_auth_cert_file": "",
          "bind_address": "0.0.0.0",
          "tls_cert_file": "",
          "decompress_size_limit": 8388608,
          "port": 12200,
          "tls_key_file": "",
          "tls_enable": false,
          "tls_key_password": "",
          "max_message_size": 2097152,
          "tls_client_auth": "disabled",
          "override_source": null
        },
        "static_fields": {},
        "node": null,
        "id": "5a9d3ae5fcf123453a7"
      }
    },
    {
      "id": "5a94423bfcf53920285e3a3b",
      "state": "RUNNING",
      "started_at": "2021-09-20T10:15:49.609Z",
      "detailed_message": null,
      "message_input": {
        "title": "Apache Filebeat",
        "global": true,
        "name": "Beats (deprecated)",
        "content_pack": null,
        "created_at": "2018-02-26T17:50:30.581Z",
        "type": "org.graylog.plugins.beats.BeatsInput",
        "creator_user_id": "adminuser",
        "attributes": {
          "recv_buffer_size": 1048576,
          "port": 5040,
          "tls_key_file": "",
          "tls_enable": false,
          "tls_key_password": "",
          "tcp_keepalive": false,
          "tls_client_auth_cert_file": "",
          "tls_client_auth": "disabled",
          "override_source": null,
          "bind_address": "0.0.0.0",
          "tls_cert_file": ""
        },
        "static_fields": {},
        "node": null,
        "id": "5a94423bfcf53555555e3a3b"
      }
    }
  ]
}

Using QuickType I have this class I'm attempting to deserialize into:

namespace Phono.Packages.GraylogLowLevelRESTClient.Models
{
    using System;
    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

    [JsonObject]
    public partial class ClusterInputstates
    {
        [JsonProperty("f6a1ad82-4b5f-430d-92a0-817927f5beaa")]
        public NodeId[] NodeId { get; set; }
    }

    public partial class NodeId
    {
        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("state")]
        public string State { get; set; }

        [JsonProperty("started_at")]
        public DateTimeOffset StartedAt { get; set; }

        [JsonProperty("detailed_message")]
        public string DetailedMessage { get; set; }

        [JsonProperty("message_input")]
        public MessageInput MessageInput { get; set; }
    }

    public partial class MessageInput
    {
        [JsonProperty("title")]
        public string Title { get; set; }

        [JsonProperty("global")]
        public bool Global { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("content_pack")]
        public object ContentPack { get; set; }

        [JsonProperty("created_at")]
        public DateTimeOffset CreatedAt { get; set; }

        [JsonProperty("type")]
        public string Type { get; set; }

        [JsonProperty("creator_user_id")]
        public string CreatorUserId { get; set; }

        [JsonProperty("attributes")]
        public Attributes Attributes { get; set; }

        [JsonProperty("static_fields")]
        public StaticFields StaticFields { get; set; }

        [JsonProperty("node")]
        public Guid? Node { get; set; }

        [JsonProperty("id")]
        public string Id { get; set; }
    }

    public partial class Attributes
    {
        [JsonProperty("recv_buffer_size", NullValueHandling = NullValueHandling.Ignore)]
        public long? RecvBufferSize { get; set; }

        [JsonProperty("tcp_keepalive", NullValueHandling = NullValueHandling.Ignore)]
        public bool? TcpKeepalive { get; set; }

        [JsonProperty("use_null_delimiter", NullValueHandling = NullValueHandling.Ignore)]
        public bool? UseNullDelimiter { get; set; }

        [JsonProperty("tls_client_auth_cert_file", NullValueHandling = NullValueHandling.Ignore)]
        public string TlsClientAuthCertFile { get; set; }

        [JsonProperty("bind_address", NullValueHandling = NullValueHandling.Ignore)]
        public string BindAddress { get; set; }

        [JsonProperty("tls_cert_file", NullValueHandling = NullValueHandling.Ignore)]
        public string TlsCertFile { get; set; }

        [JsonProperty("decompress_size_limit", NullValueHandling = NullValueHandling.Ignore)]
        public long? DecompressSizeLimit { get; set; }

        [JsonProperty("port", NullValueHandling = NullValueHandling.Ignore)]
        public long? Port { get; set; }

        [JsonProperty("tls_key_file", NullValueHandling = NullValueHandling.Ignore)]
        public string TlsKeyFile { get; set; }

        [JsonProperty("tls_enable", NullValueHandling = NullValueHandling.Ignore)]
        public bool? TlsEnable { get; set; }

        [JsonProperty("tls_key_password", NullValueHandling = NullValueHandling.Ignore)]
        public string TlsKeyPassword { get; set; }

        [JsonProperty("max_message_size", NullValueHandling = NullValueHandling.Ignore)]
        public long? MaxMessageSize { get; set; }

        [JsonProperty("tls_client_auth", NullValueHandling = NullValueHandling.Ignore)]
        public string TlsClientAuth { get; set; }

        [JsonProperty("override_source")]
        public object OverrideSource { get; set; }

        [JsonProperty("heartbeat", NullValueHandling = NullValueHandling.Ignore)]
        public long? Heartbeat { get; set; }

        [JsonProperty("prefetch", NullValueHandling = NullValueHandling.Ignore)]
        public long? Prefetch { get; set; }

        [JsonProperty("exchange_bind", NullValueHandling = NullValueHandling.Ignore)]
        public bool? ExchangeBind { get; set; }

        [JsonProperty("broker_vhost", NullValueHandling = NullValueHandling.Ignore)]
        public string BrokerVhost { get; set; }

        [JsonProperty("broker_username", NullValueHandling = NullValueHandling.Ignore)]
        public string BrokerUsername { get; set; }

        [JsonProperty("broker_port", NullValueHandling = NullValueHandling.Ignore)]
        public long? BrokerPort { get; set; }

        [JsonProperty("parallel_queues", NullValueHandling = NullValueHandling.Ignore)]
        public long? ParallelQueues { get; set; }

        [JsonProperty("broker_password", NullValueHandling = NullValueHandling.Ignore)]
        public string BrokerPassword { get; set; }

        [JsonProperty("throttling_allowed", NullValueHandling = NullValueHandling.Ignore)]
        public bool? ThrottlingAllowed { get; set; }

        [JsonProperty("exchange", NullValueHandling = NullValueHandling.Ignore)]
        public string Exchange { get; set; }

        [JsonProperty("tls", NullValueHandling = NullValueHandling.Ignore)]
        public bool? Tls { get; set; }

        [JsonProperty("routing_key", NullValueHandling = NullValueHandling.Ignore)]
        public string RoutingKey { get; set; }

        [JsonProperty("requeue_invalid_messages", NullValueHandling = NullValueHandling.Ignore)]
        public bool? RequeueInvalidMessages { get; set; }

        [JsonProperty("broker_hostname", NullValueHandling = NullValueHandling.Ignore)]
        public string BrokerHostname { get; set; }

        [JsonProperty("queue", NullValueHandling = NullValueHandling.Ignore)]
        public string Queue { get; set; }

        [JsonProperty("idle_writer_timeout", NullValueHandling = NullValueHandling.Ignore)]
        public long? IdleWriterTimeout { get; set; }

        [JsonProperty("max_chunk_size", NullValueHandling = NullValueHandling.Ignore)]
        public long? MaxChunkSize { get; set; }

        [JsonProperty("enable_cors", NullValueHandling = NullValueHandling.Ignore)]
        public bool? EnableCors { get; set; }

        [JsonProperty("force_rdns", NullValueHandling = NullValueHandling.Ignore)]
        public bool? ForceRdns { get; set; }

        [JsonProperty("store_full_message", NullValueHandling = NullValueHandling.Ignore)]
        public bool? StoreFullMessage { get; set; }

        [JsonProperty("expand_structured_data", NullValueHandling = NullValueHandling.Ignore)]
        public bool? ExpandStructuredData { get; set; }

        [JsonProperty("allow_override_date", NullValueHandling = NullValueHandling.Ignore)]
        public bool? AllowOverrideDate { get; set; }
    }

    public partial class StaticFields
    {
    }

    public partial class ClusterInputstates
    {
        public static ClusterInputstates FromJson(string json) => JsonConvert.DeserializeObject<ClusterInputstates>(json, Phono.Packages.GraylogLowLevelRESTClient.Models.Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this ClusterInputstates self) => JsonConvert.SerializeObject(self, Phono.Packages.GraylogLowLevelRESTClient.Models.Converter.Settings);
    }

    internal static class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters =
            {
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }
}

It works, but I am unable to deserialize unless I specify the first element explicitly in JsonPropery.

IE: [JsonProperty("f6a1ad82-4b5f-430d-92a0-817927f5beaa")]

In reality, this property is a GUID and subject to change all the time (as well as the possibility of multiple GUID objects in their own array).

I've tried variations of:

public Dictionary<string, NodeId[]> NodeId { get; set; }

but this either results in an exception/failure to deserialize or the object returned is null.

What am I missing?

3
  • It indeed looks like you need to read into a dictionary. Please work on creating minimal reproducible example and edit the question with code and data that demonstrates the problem (the huge object/partial JSON in the question are not minimal example). Commented Sep 28, 2021 at 21:48
  • What is the exception/failure message when deserializing using Dictionary<string, NodeId[]>? This seems like it is the correct type to deserialize with. Commented Sep 28, 2021 at 21:56
  • Not sure what I did wrong but it seems to be deserializing for me now.. I am now getting a single key/value pair with the GUID as my key. Values has all my types in it under a single object with 8 individual objects int. I'd like to access them. Commented Sep 28, 2021 at 22:48

1 Answer 1

1

This was tested using Visual Studio 2019 and serialize libraries. Everything is working properly.

using Newtonsoft.Json

 var deserializedJson= JsonConvert.DeserializeObject<Dictionary<string, List<Message>>>(json);

How to use (examples)

List<Message> result =  deserializedJson.Values.FirstOrDefault();

var startedAt=result[0].StartedAt;
//or
 var startedAt=result.FirstOrDefault().StartedAt;

var  port0=result[0].MessageInput.Attributes.Port;
//or
var  port0=result.Where(r => r.Id== "5a9d3ae5fcf53960035643a7").FirstOrDefault()
.MessageInput.Attributes.Port;

var port1 = result[1].MessageInput.Attributes.Port;

ouput

2021-09-20 10:15:49 AM +00:00
12200
5040

classes

public partial class Message
    {
        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("state")]
        public string State { get; set; }

        [JsonProperty("started_at")]
        public DateTimeOffset StartedAt { get; set; }

        [JsonProperty("detailed_message")]
        public object DetailedMessage { get; set; }

        [JsonProperty("message_input")]
        public MessageInput MessageInput { get; set; }
    }

    public partial class MessageInput
    {
        [JsonProperty("title")]
        public string Title { get; set; }

        [JsonProperty("global")]
        public bool Global { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("content_pack")]
        public object ContentPack { get; set; }

        [JsonProperty("created_at")]
        public DateTimeOffset CreatedAt { get; set; }

        [JsonProperty("type")]
        public string Type { get; set; }

        [JsonProperty("creator_user_id")]
        public string CreatorUserId { get; set; }

        [JsonProperty("attributes")]
        public Attributes Attributes { get; set; }

        [JsonProperty("static_fields")]
        public StaticFields StaticFields { get; set; }

        [JsonProperty("node")]
        public object Node { get; set; }

        [JsonProperty("id")]
        public string Id { get; set; }
    }

    public partial class Attributes
    {
        [JsonProperty("recv_buffer_size")]
        public long RecvBufferSize { get; set; }

        [JsonProperty("tcp_keepalive")]
        public bool TcpKeepalive { get; set; }

        [JsonProperty("use_null_delimiter", NullValueHandling = NullValueHandling.Ignore)]
        public bool? UseNullDelimiter { get; set; }

        [JsonProperty("tls_client_auth_cert_file")]
        public string TlsClientAuthCertFile { get; set; }

        [JsonProperty("bind_address")]
        public string BindAddress { get; set; }

        [JsonProperty("tls_cert_file")]
        public string TlsCertFile { get; set; }

        [JsonProperty("decompress_size_limit", NullValueHandling = NullValueHandling.Ignore)]
        public long? DecompressSizeLimit { get; set; }

        [JsonProperty("port")]
        public long Port { get; set; }

        [JsonProperty("tls_key_file")]
        public string TlsKeyFile { get; set; }

        [JsonProperty("tls_enable")]
        public bool TlsEnable { get; set; }

        [JsonProperty("tls_key_password")]
        public string TlsKeyPassword { get; set; }

        [JsonProperty("max_message_size", NullValueHandling = NullValueHandling.Ignore)]
        public long? MaxMessageSize { get; set; }

        [JsonProperty("tls_client_auth")]
        public string TlsClientAuth { get; set; }

        [JsonProperty("override_source")]
        public object OverrideSource { get; set; }
    }

    public partial class StaticFields
    {
    }
Sign up to request clarification or add additional context in comments.

6 Comments

Thanks. This got me through a null error. I now have an object with a single key (representing the clusterID) and Values behind it. I expected a fully typed object I can address.
@DanielSputnikk This was tested using Visual Studio 2019 and 2 libraries. Everything is working properly.
I'm getting a resultset of a single key and multiple value objects. How can I access result[0].Message.MessageInput.Attributes.Port?
@DanielSputnikk See my updated answer
Thank you kind Canadian.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.