在没有Object的C#中操作JSON字符串

时间:2015-10-19 06:46:41

标签: c# json appendchild

我有JSON字符串,我正在从文件中读取。 我没有JSON对象的源代码。 所以我不能打电话给JsonConvert.DeserializeObject

但是我想检查JSON字符串是否具有特定结构,如果是,则附加一些字符串或如果不附加结构。

allmodules {
    feature: 'test-a'
}

submodules {
    //some data
}

假设没有allmodules,我想附加我的结构

allmodules {
    feature: 'debug-a'
}

如果它已经可用,只需附加feature: 'debug-a'

即可

等我有一些定制工作要做。有没有有效的方法来做到这一点而不破坏JSON格式。关于String to Object反序列化的大多数问题,但正如我所提到的,我没有原始的Object,也不能这样做。

3 个答案:

答案 0 :(得分:2)

您可以使用JObject执行此操作并进行一些手动解析。它可能看起来像这样:

public string AppendAllModules(string json)
{
    var obj = JObject.Parse(json);
    JToken token;
    if (obj.TryGetValue("allmodules", out token))
        return json;

    obj.Add(new JProperty("allmodules", new JObject(new JProperty("feature", "test-a"))));
    return obj.ToString();
}

假设:

{
    "submodules": {
        "name": "yuval"
    }
}

会屈服:

{
  "submodules": {
    "name": "yuval"
  },
  "allmodules": {
    "feature": "test-a"
  }
}

答案 1 :(得分:1)

  

我没有JSON对象的来源。

不用担心,您可以简单地构造一个与JSON定义兼容的新C#对象。

列出了许多选项

How to auto-generate a C# class file from a JSON object string

在项目中拥有兼容的C#类之后,您可以反序列化JSON并将其作为对象进行操作,就像您拥有原始对象一样。

答案 2 :(得分:0)

使用JObject.FromObjectJObject.Parse将您的文件json字符串转换为JObject。 然后下面的示例代码可能有所帮助。我将通过If/else方式进行,因为您提到您无法获得确切的结构。

JObject obj = JObject.FromObject(
        new {Id = 5, Name = "Foo"}
    );
    JToken jtok = null;
    bool found = obj.TryGetValue("Bar",StringComparison.CurrentCultureIgnoreCase, out jtok);
    if (!found)
    {
        obj.Add("Bar","this is added");
    }
    else
    {
        Console.WriteLine(jtok);
    }

    Console.WriteLine(obj["Bar"]);

当然,在完成JObject的编辑后,您可以使用JObject.ToString()方法获取字符串表示并将其发送到文件。