在我开始之前 - 我应该说我对JSON的经验很少。我对Java的所有经验都是使用Java中的SnakeYaml ...
其次,如果您认为为此项目寻求二级解决方案更好,请告诉我......
我有一个TCP服务器,它接受一个json格式的字符串,并返回一个包含所请求信息的json格式的字符串。以下是它正在做的事情的一个例子。
请求
{
'MyName': 'John Doe'
'MandatoryLookup': false
}
响应
{
'John Doe': {
'Location' : 'Big Office Building'
'Additional': 'Floor 2'
}
}
此部分工作正常,仅供理解。
重新启动,提供响应的服务器在完成SQL查询后返回此信息。我想要做的是将此查询保存在内存中(使用下面制作的自定义对象)以及将其存储在磁盘上的json文件中。当服务器启动时,我希望它从这个json文件中读取并将其反序列化为我的对象。这样,它几乎可以立即返回响应,而不必每次都执行查找。如果服务器没有手头的信息或" MandatoryLookup" flag为true
,它向SQL服务器查询响应。
这是自定义对象的类:
public class DataContainer
{
public string UserName { get; set; }
public info LocationInfo locationInfo;
}
public class LocationInfo
{
public string BuildingName { get; set; }
public string AdditionalInfo { get; set; }
}
^上面的想法转到另一个关于子类别的StackOverflow线程,但我不知道这是否正确,如果下面是JSON字符串。
RecentLookups.json ((这是我在启动时解析保存到磁盘的文件))
{
'John Doe' : {
'Location' : 'Big Office Building',
'Additional' : 'Floor 2'
},
'Jane Doe' : {
'Location' : 'Small Office Building',
'Additional' : 'Security Office'
}
}
这最终分为三个问题
我的JSON群组的名称不是可重复的名称 - 也就是说,不会有一个名称为' Jane Doe'的群组。相反,提供这些示例是为了提高可读性。实际组名称是对象的唯一标识符,子类别(位置,附加)是关于所述对象的信息。我想要的是每个DataContainer对象具有基于JSON类别名称的唯一名称,例如' Jane Doe'将DataContainer JaneDoe
设置为该对象的属性。
对不起,请提前致谢。
答案 0 :(得分:1)
您可以将该JSON反序列化为Dictionary<string, LocationInfo>
:
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, LocationInfo>>(jsonString);
见Deserialize a Dictionary。然后,如果需要,您可以转换为最终模型:
var list = dictionary.Select(pair => new DataContainer { UserName = pair.Key, locationInfo = pair.Value }).ToList();
此外,由于LocationInfo
中的c#POCO属性名称与您收到的JSON中的名称不匹配,因此您需要使用[JsonProperty]
属性手动设置映射:
public class LocationInfo
{
[JsonProperty("Location")]
public string BuildingName { get; set; }
[JsonProperty("Additional")]
public string AdditionalInfo { get; set; }
}