【问题标题】:Deserializing JSON Nested Dictionaries反序列化 JSON 嵌套字典
【发布时间】:2022-01-22 23:22:51
【问题描述】:

我的 JSON 消息包含字符串、列表和嵌套字典的组合,如下所示。

message = {
        "series":"A",
        "series_color": ["red","blue","green"],
        "parts":{
            "part1":{"id-01":"contextA", "id-02":"contextB", "id-03":"contextC"},
            "part2":{"id-01":"contextA", "id-02":"contextB", "id-03":"contextC"}
          }
        } 

这是在 Unity 的 C# 脚本中收到的,我使用以下方法反序列化:

// Translates Byte into String
var Message = System.Text.Encoding.Default.GetString(e.Message);

// Translates String into Object and stores in Dictionary
Dictionary<string, object> MessageDICT = JsonConvert.DeserializeObject<Dictionary<string, object>>(Message);

从这里我可以打印出前两条消息seriesseries_color

// Series
object series= MessageDICT["series"];
print(series);
    
// Series Color
object series_color = (JArray)MessageDICT["series_color"])[0]
print(series_color)

问题出现在我尝试解压缩嵌套字典 parts 的内容时,因为它的意外值(例如“{”)我无法解压缩它。

我知道有一些手动方法可以尝试将“{”替换为“[”并将其用作数组,以及创建一个类来读取 JSON(显示有关 Unity 主线程的错误)但是这些不是我正在寻找的解决方案。

有什么方法可以解压所有这些吗?

【问题讨论】:

  • 您能详细解释一下您遇到问题的地方吗? parts 属性应反序列化为另一个 Dictionary&lt;string,object&gt;

标签: c# unity3d


【解决方案1】:

你不需要反序列化json,你可以使用解析访问“部分”

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

Dictionary<string,object> parts= ((JObject)MessageDICT["parts"]).Properties()
.SelectMany(i => new Dictionary<string, object> { {i.Name,i.Value} })
.ToDictionary(i => i.Key, i=>i.Value );

var part1Id01 = ((JObject) parts["part1"])["id-01"] ; // contextA

【讨论】:

    【解决方案2】:

    在这种情况下,我建议使用强类型类和 System.Text.Json(或您选择的序列化库)来反序列化您的对象。您可以创建如下类:

    public class MyClass
    {
        [JsonPropertyName("series")]
        public string Series { get; set; }
        [JsonPropertyName("series_color")]
        public List<string> SeriesColor { get; set; }
        [JsonPropertyName("parts")]
        public Dictionary<string, PartsClass> Parts { get; set; }
    }
    
    public class PartsClass 
    {
        [JsonPropertyName("id-01")]
        public string Id1 { get; set; }
        [JsonPropertyName("id-02")]
        public string Id2 { get; set; }
        [JsonPropertyName("id-03")]
        public string Id3 { get; set; }
    }
    

    然后你可以像这样使用序列化器:

    var serialized = JsonSerializer.Deserialize<MyClass>(message);
    

    如果“PartsClass”是动态的(即你永远不知道你可能有多少个 id),那么你可以制作另一个 Dictionary

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 2011-09-18
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      相关资源
      最近更新 更多