在没有对象的情况下在 C# 中操作 JSON 字符串

Manipulating JSON String in C# without Object

我有 JSON 个正在从文件中读取的字符串。 我没有 JSON 对象的来源。 所以我不能调用JsonConvert.DeserializeObject

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

allmodules {
    feature: 'test-a'
}

submodules {
    //some data
}

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

allmodules {
    feature: 'debug-a'
}

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

等等我还有一些定制工作要做。有没有什么有效的方法可以在不破坏 JSON 格式的情况下做到这一点。大多数关于字符串到对象反序列化的问题,但是正如我提到的,我没有原始对象,也不能这样做。

I don't have the source of the JSON Object.

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

中列出了许多选项

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

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

使用 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() 方法获取字符串表示并将其发送到文件。

您可以使用 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"
  }
}