在没有对象的c#中操作JSON字符串

本文关键字:操作 JSON 字符串 对象 | 更新日期: 2023-09-27 18:18:12

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

然而,我想检查JSON字符串是否有特定的结构,如果是,附加一些字符串或如果没有附加结构。

allmodules {
    feature: 'test-a'
}
submodules {
    //some data
}

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

allmodules {
    feature: 'debug-a'
}

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

等等,我有一些定制的工作要做。有没有有效的方法来做到这一点,而不破坏JSON格式。大多数关于字符串到对象反序列化的问题,然而,正如我提到的,我没有原始对象,不能这样做。

在没有对象的c#中操作JSON字符串

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

我没有JSON对象的源代码。

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

中列出了许多选项

如何从JSON对象字符串自动生成c#类文件

一旦你的项目中有了一个兼容的c#类,你就可以反序列化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()方法来获得字符串表示并将其发送到文件