2015-10-19 8 views
2

У меня есть строка JSON, которую я читаю из файла. У меня нет источника объекта JSON. Так что я не могу позвонить JsonConvert.DeserializeObject.Манипулирование JSON String в C# без объекта

Однако я хочу проверить, имеет ли строка JSON определенную структуру, если да, добавьте некоторую строку или если не добавить структуру.

allmodules { 
    feature: 'test-a' 
} 

submodules { 
    //some data 
} 

Предположит, если не allmodules, я хотел бы добавить мою структуру

allmodules { 
    feature: 'debug-a' 
} 

Если это уже доступно, просто добавьте feature: 'debug-a'

и т.д. У меня есть некоторые пользовательские работы. Есть ли эффективный способ сделать это, не нарушая формат JSON. Большинство вопросов, касающихся String для де-сериализации объектов, однако, как я уже говорил, у меня нет оригинального объекта, и я не могу этого сделать.

+1

* У меня нет источника объекта JSON * Тогда где находится JSON? –

+0

@YuvalItzchakov JSON исходит из файла. Подумайте, как инструмент для настройки/добавления некоторых данных в файл JSON во время выполнения. – Reddy

+0

Таким образом, ввод - любой json, а выход - json, который подтверждает вашу json-схему. – singsuyash

ответ

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" 
    } 
} 
+0

Тот же ответ, более отформатированный :(? – singsuyash

+0

@singsuyash Ваш код не соответствует требованиям OP. Вы просто добавляете новый ключевое значение. Я начал писать этот ответ, прежде чем вы разместили свои сообщения :) –

+0

Согласен Я кое-что узнал :) – singsuyash

1

У меня нет источника объекта JSON.

Не беспокойтесь, вы можете просто построить новый объект C#, который он совместим с определением JSON. Есть несколько вариантов, перечисленных в

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

После того, как у вас есть совместимый C# класс в вашем проекте, вы можете десериализации JSON и манипулировать его как объект, так же, как если бы вы имели исходный объект.

+0

J, что, если строка JSON источника изменяется. У меня нет конкретной модели, которая будет такой JSON. он может иметь некоторые дочерние атрибуты или может и не быть. Дело в том, что мне не нужно понимать весь JSON того же самого, просто пойти с добавлением моей настройки и перейти на – Reddy

+0

@Reddy: если вы десериализовываете тип, тип безопасности защитит вас от несовместимых изменений, которые могут быть если вы просто манипулируете JSON как строку. Мое предпочтение заключалось бы в том, чтобы разбить мой код, если зависимость сторонней организации неожиданно изменяется, а не слепо обрабатывает эту зависимость. –

+0

Я согласен с вами, однако у меня нет прав на импорт (называйте это ограничением) – Reddy

0

используйте JObject.FromObject или JObject.Parse, чтобы получить файл json string в 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(), чтобы получить строковое представление и отправить его на файл.