我的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);
从这里我可以打印出前两条消息series
和series\u color
。
// Series
object series= MessageDICT["series"];
print(series);
// Series Color
object series_color = (JArray)MessageDICT["series_color"])[0]
print(series_color)
问题出现在我试图解压嵌套字典部件
的内容时,因为它的意外值(如{)而无法解压它。
我知道有一些手动方法试图将“{”替换为“[”,并将其用作数组,以及创建一个类来读取JSON(显示有关Unity主线程的错误),但是这些不是我正在寻找的解决方案。
有没有办法把这些东西都拆开?提前谢谢。
您不需要反序列化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),那么你可以把它变成另一个词典