2015-11-20 3 views
0

Я использую gson для сериализации и десериализации. У меня следующий объект:Json in a Json

OBJECT A: 
String myEmail; 
int rank; 
String msgData; 

В приведенном выше случае, msgData является строка JSON, поэтому указанные выше объект в виде JSON будет десериализации в 2 этапа. По определенным причинам мы должны сделать это за 2 шага. Объект B ниже - будет json для msgData выше.

OBJECT B: 
String myName; 
int myNumber; 
String[] myStrings; 

Json для объекта B выглядит следующим образом:

{ 
    "myName": "TheJumper", 
    "myNumber": "35", 
    "myString": [ 
    "abc", 
    "efg", 
    "xyz" 
    ] 
} 

Вопрос: Как мы представляем JSON - ОБЪЕКТ В; в json-форме для OBJECT A, так что, когда OBJECT A десериализуется, json для OBJECT B можно извлечь как String.

Например: Json для объекта А можно представить в виде (Действительный Json):

{ 
    "myEmail": "[email protected]", 
    "myRank": "50", 
    "msgData": "This is a Message" 
} 

Когда я попробовать следующее - это даст мне ошибку недействительных JSON.

{ 
    "myEmail": "[email protected]", 
    "myRank": "50", 
    "msgData": "{ 
     "myName": "TheJumper", 
     "myNumber": "35", 
     "myString": [ 
     "abc", 
     "efg", 
     "xyz" 
     ] 
    }" 
} 

Я пробовал несколько вещей, но не смог его решить. Как это будет сделано?

+0

кавычки должны быть экранированы. "{\" name \ ": \" foo \ "}" –

+0

Спасибо Клоду Мартину. Я попробовал это предложение, но оставил объект B в нескольких строках. Я проверил с JsonLint, и это дало мне ошибку. Кажется, что если объект B представлен в одной строке с бегством, то он работает. Почему? (см. ответ ответа на ответ). – userDSSR

ответ

2

Как мы представляем json - OBJECT B; в json-форме для OBJECT A, так что, когда OBJECT A десериализуется, json для OBJECT B можно извлечь как String.

Вам нужно будет избежать всех котировок с \" в строке OBJECT B JSON;

{ 
    "myEmail": "[email protected]", 
    "myRank": "50", 
    "msgData": "{ 
     \"myName\": \"TheJumper\", 
     \"myNumber\": \"35\", 
     \"myString\": [ 
     \"abc\", 
     \"efg\", 
     \"xyz\" 
     ] 
    }" 
} 

Рухнул на одной линии, это выглядит следующим образом:

{ 
    "myEmail": "[email protected]", 
    "myRank": "50", 
    "msgData": "{ \"myName\": \"TheJumper\", \"myNumber\": \"35\", \"myString\": [ \"abc\", \"efg\", \"xyz\" ] }" 
} 

Однако, лучший подход пишет действительный JSON, а затем преобразовать его представление в виде строки. Таким образом, вам не нужно беспокоиться о том, чтобы избежать чего-либо. Например, вы бы:

{ 
    "myEmail": "[email protected]", 
    "myRank": "50", 
    "msgData": { 
     "myName": "TheJumper", 
     "myNumber": "35", 
     "myString": [ 
     "abc", 
     "efg", 
     "xyz" 
     ] 
    } 
} 

Затем, когда вы получите msgData, используйте GSON, чтобы преобразовать его в строку с Gson#toJson()

+0

Спасибо nickb. Я пробовал то же, что и ваш первый код. Первый код - при проверке на jsonlint дает ошибку. Но когда я проверил ваш второй код - «одна строка» - это было подтверждено. Любая причина, по которой первый код не считался действительным. – userDSSR