提问者:小点点

反序列化JSON嵌套字典


我的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\u color

// Series
object series= MessageDICT["series"];
print(series);

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

问题出现在我试图解压嵌套字典部件的内容时,因为它的意外值(如{)而无法解压它。

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

有没有办法把这些东西都拆开?提前谢谢。


共2个答案

匿名用户

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

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

var parts = ((JObject)items["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

匿名用户

在这种情况下,我建议使用强类型类和系统。文本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);

如果Part sClass是动态的(也就是说,你永远不知道你可能有多少id),那么你可以把它变成另一个词典