JSON.net使用唯一类型

时间:2016-06-08 23:03:25

标签: c# json json.net

在我开始之前 - 我应该说我对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'
    }
}

这最终分为三个问题

  1. 在查看如何格式化对象以进行反序列化时,最好的起点是什么(因为它现在的工作方式不起作用)。
  2. 担心将格式化的sql查询预先缓存到磁盘值得麻烦(SQL查找是否足够快,只是让它每次查找值)?
  3. 我如何以编程方式为每个Json组创建一个唯一命名的DataContainer对象? - 以下示例
  4. 我的JSON群组的名称不是可重复的名称 - 也就是说,不会有一个名称为' Jane Doe'的群组。相反,提供这些示例是为了提高可读性。实际组名称是对象的唯一标识符,子类别(位置,附加)是关于所述对象的信息。我想要的是每个DataContainer对象具有基于JSON类别名称的唯一名称,例如' Jane Doe'将DataContainer JaneDoe设置为该对象的属性。

    对不起,请提前致谢。

1 个答案:

答案 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; }
}