簡體   English   中英

將包含多個json對象的字符串解析為更方便的內容

[英]Parse a string containing several json objects into something more convenient

問題的症結在於,我不了解任何C#,但發現自己在一些恰好用C#編寫的測試基礎架構中添加了功能。 我懷疑這個問題完全無關緊要,請您耐心等待。 最初寫這些東西的同事都不在辦公室。

我正在解析表示一個或多個json對象的字符串。 到目前為止,我可以獲取第一個對象,但是無法計算出如何訪問其余對象。

public class demo
{
public void minimal()
{
    // Note - the input is not quite json! I.e. I don't have 
    // [{"Name" : "foo"}, {"Name" : "bar"}]
    // Each individual object is well formed, they just aren't in
    // a convenient array for easy parsing.
    // Each string representation of an object are literally concatenated.

    string data = @"{""Name"": ""foo""} {""Name"" : ""bar""}";

    System.Xml.XmlDictionaryReader jsonReader = 
       JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(data),
       new System.Xml.XmlDictionaryReaderQuotas());

    System.Xml.Linq.XElement root = XElement.Load(jsonReader);
    Assert.AreEqual(root.XPathSelectElement("//Name").Value, "foo");

    // The following clearly doesn't work
    Assert.AreEqual(root.XPathSelectElement("//Name").Value, "bar");
}
}

我大概是在滾動足夠多的解析器,以計算括號的位置來拆分字符串,但我希望庫支持為我做這件事。

理想的最終結果是您選擇的順序數據結構(列表,向量?不在乎),對於嵌入在字符串中的每個json對象都包含一個System.Xml.Linq.XElement

謝謝!

編輯:大致可行的示例,主要是由於喬治·理查德森(George Richardson)-我正在使用類型系統(在C#3.0中不能確定動態范圍)來回彈,但最終結果似乎是可預測的。

public class demo
{
    private IEnumerable<Newtonsoft.Json.Linq.JObject>
            DeserializeObjects(string input)
    {
        var serializer = new JsonSerializer();
        using (var strreader = new StringReader(input))
        {
            using (var jsonreader = new JsonTextReader(strreader))
            {
                jsonreader.SupportMultipleContent = true;
                while (jsonreader.Read())
                {
                    yield return (Newtonsoft.Json.Linq.JObject)
                                  serializer.Deserialize(jsonreader);
                }
            }
        }
    }

    public void example()
    {
        string json = @"{""Name"": ""foo""} {""Name"" : ""bar""} {""Name"" : ""baz""}";
        var objects = DeserializeObjects(json);

        var array = objects.ToArray();
        Assert.AreEqual(3, array.Length);
        Assert.AreEqual(array[0]["Name"].ToString(), "foo");
        Assert.AreEqual(array[1]["Name"].ToString(), "bar");
        Assert.AreEqual(array[2]["Name"].ToString(), "baz");
    }
}

您將要使用JSON.net滿足實際的反序列化需求。 我在這里看到的最大問題是您的json數據只是串聯在一起,這意味着您將不得不從字符串中提取每個對象。 幸運的是,json.net的JsonReader具有SupportMultipleContent屬性,該屬性可以完成此任務

public void Main()
{
    string json = @"{""Name"": ""foo""} {""Name"" : ""bar""} {""Name"" : ""baz""}";
    IEnumerable<dynamic> deserialized = DeserializeObjects(json);
    string name = deserialized.First().Name; //name is "foo"
}

IEnumerable<object> DeserializeObjects(string input)
{
    JsonSerializer serializer = new JsonSerializer();
    using (var strreader = new StringReader(input)) {
        using (var jsonreader = new JsonTextReader(strreader)) {
            jsonreader.SupportMultipleContent = true;
            while (jsonreader.Read()) {
                yield return serializer.Deserialize(jsonreader);
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM