JSON.NET添加/编辑子项

时间:2011-09-13 18:02:26

标签: c# json json.net

我目前正在尝试从网络服务器读取一个JSON文档(它是一个物理json文件)并检查对我的数据库的更改。换句话说,我需要每晚都同步json文档和数据库。

为此,我正在使用JSON.NET,我相信在C#中使用JSON时要采用的方式(?).NET平台版本为3.5。

到目前为止,我能够阅读文档并从中获取值。

我的JSON看起来像这样:

{"members":[

{"member":
    {
        "id":"4282",
        "status":"1931",
        "aktiv":"1",
        "firmanavn":"firmname1",
        "firmaUrl":"www.firmsite.com",
        "firmaUrlAlternativ":"",
        "firmaSidstKontrolleretDato":"30-08-2010",
        "firmaGodkendelsesDato":"07-03-2002"
    }
},
{"member":
    {
        "id":"4283",
        "status":"1931",
        "aktiv":"1",
        "firmanavn":"firmname2",
        "firmaUrl":"www.firmsite.com",
        "firmaUrlAlternativ":"",
        "firmaSidstKontrolleretDato":"30-08-2010",
        "firmaGodkendelsesDato":"18-12-2000"
    }
}, .... and so on
]}

我的C#代码如下:

using (TextReader reader = File.OpenText(Server.MapPath("~/members.json")))
    {
        JsonTextReader jsonreader = new JsonTextReader(reader);
        var o = JObject.ReadFrom(jsonreader);
        jsonreader.Close();
        JObject obj = JObject.Parse(o.ToString());

        JArray items = (JArray)obj["members"];
        var members = Member.GetAllAsList();

        JObject item;
        JToken token;

        List<string> currentIds = new List<string>();
        for (int i = 0; i < items.Count; i++)
        {
            item = (JObject)items[i];
            token = item.First;

            while (token != null)
            {
                //ltTest.Text += ((JProperty)token).Value["firmanavn"].ToString() + System.Environment.NewLine;
                currentIds.Add(((JProperty)token).Value["id"].ToString());
                token = token.Next;
            }
        }

        foreach (var member in members)
        {
            if (!currentIds.Contains(member.Id.ToString()))
            {
                ltTest.Text += member.Text;
            }
        }
    }

基本上,现在有三种情况:

  • 数据库中的成员信息已更改:我需要在JSON文档中找到该成员并更新相应的字段

  • 成员已从数据库中删除:我需要在JSON文档中找到该成员并将其删除。

  • 成员已添加到数据库中:我需要将该成员添加到JSON文档中。

那么,是否有人熟悉JSON.NET提供如何实现这一点的提示(或者可能是一些代码示例?)?我几乎没有让它真正从服务器上读取json文档,所以这对我来说似乎是一场艰苦的战斗。

2 个答案:

答案 0 :(得分:2)

Json.net有一个名为Linq-to-JSON的东西,据该网站称:

  

LINQ to JSON不是LINQ提供程序,而是用于处理的API   JSON对象。 API的设计考虑了LINQ,以便启用   快速创建和查询JSON对象。

所以它支持LINQ查询,我没有使用Linq-to-JSON,但我相信,它将满足你的所有三个要求。

如需参考和操作方法,请点击以下链接: http://james.newtonking.com/archive/2008/02/11/linq-to-json-beta.aspx http://james.newtonking.com/projects/json/help/

答案 1 :(得分:1)

为了满足您的要求,我建议采取以下步骤:

  • 将您的JSON Feed解析为易于使用的JSON对象,就像您一样
  • 为了满足您的要求,最简单的方法是使用SQL进行表对表比较。
    • 创建一个临时表以将JSON数据放入
    • 将JSON Feed中的数据转换为Relational格式。在您的情况下,使用8列
    • 创建表MEMBER非常简单

从那里,您发出与您的三种情况匹配的SQL查询:

  • 数据库中的成员信息已更改:我需要在JSON文档中找到该成员并更新相应的字段

    为了做到这一点,发出一个比较每个字段的SQL查询,使用结果集来更新JSON

  • 已从数据库中删除某个成员:我需要在JSON文档中找到该成员并将其删除。

    使用原始表中的NOT IN比较器与刚刚创建的Member表进行比较,发出SQL查询进行比较。从这里,您将从结果集中获取可用于删除相应JSON对象的ID集合

  • 已将成员添加到数据库中:我需要将该成员添加到JSON文档中。

    执行上述步骤的相反步骤。发出SQL查询,比较数据库中但不在Member表中的数据。使用结果集添加到JSON对象

在流程结束时,您将拥有代表两个

之间同步的JSON对象