我有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,也不能这样做。
答案 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.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()
方法获取字符串表示并将其发送到文件。