在没有对象的情况下在 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.FromObject
或 JObject.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"
}
}
我有 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.FromObject
或 JObject.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"
}
}