【问题标题】:JSON Deserialization for dictionary with arrays带有数组的字典的 JSON 反序列化
【发布时间】:2022-01-17 18:15:24
【问题描述】:

我有一个通过 MQTT 发送这个 JSON 的 Python 代码。

message = {
        "name":"Alex",
        "date": 2021,
        "activity":["act1","act2","act3"],
        } 

然后我在 C# 脚本中接收并反序列化它

public void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
    { 
          var Message = System.Text.Encoding.Default.GetString(e.Message);
          Dictionary<string, string> MessageDICT = JsonConvert.DeserializeObject<Dictionary<string, string>>(Message);
    }

"name""date" 键在反序列化到字典中没有问题。但是,"activity" 会出现错误,因为它是一个数组。它指出“解析值时遇到意外字符:[”。我见过他们分别反序列化它的方法(数组在不同的消息中发送),但这不是我想要的。有没有办法可以将整个消息反序列化?

谢谢。

【问题讨论】:

  • 请标记 c# 或 python,但最好不要同时标记。这很令人困惑,因为所需的结果实际上是用 c# 编码的,而不是 python。

标签: c# json


【解决方案1】:

您的字典声明为&lt;string, string&gt;,但“活动”是一个数组。所以这就是它不起作用的原因。

如果您想继续使用字典,则可以改为将其声明为&lt;string, object&gt;,然后它将适用于任何类型的数据。但是你需要在以后尝试使用它之前检查它是什么类型。

Dictionary<string, object> MessageDICT = JsonConvert.DeserializeObject<Dictionary<string, object>>(message);

然后您可以像这样访问它:

object first = ((JArray)MessageDICT["activity"])[0];

但如果可能的话,您应该尝试对数据使用固定类并对其进行反序列化。 否则,也许动态更好。

【讨论】:

  • 我明白了,现在它被认为是一个对象而不是一个字符串,当我尝试将它等同于变量时:List_Activities = MessageDICT["activity"];它引发错误,也尝试删除引号并具有相同的结果。我怎样才能使这项工作,以便我可以访问字典中的对象类型?
【解决方案2】:

你好为什么不使用类来读取json

public class Message
{
  public string name {get;set;}
  public string date {get;set;} //actually, this looks like an int the json, however...
  public string[] activity {get;set;}
}

用法

var res = JsonConvert.DeserializeObject<Message>(message);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多