| Index: webrtc/examples/objc/AppRTCDemo/RTCICECandidate+JSON.m
 | 
| diff --git a/webrtc/examples/objc/AppRTCDemo/RTCICECandidate+JSON.m b/webrtc/examples/objc/AppRTCDemo/RTCICECandidate+JSON.m
 | 
| index f20c490682a3410e8894ae07b8f6ef263faf8f00..b1be7fb7e3cb995353768041d15cca94e789cdf8 100644
 | 
| --- a/webrtc/examples/objc/AppRTCDemo/RTCICECandidate+JSON.m
 | 
| +++ b/webrtc/examples/objc/AppRTCDemo/RTCICECandidate+JSON.m
 | 
| @@ -17,6 +17,8 @@ static NSString const *kRTCICECandidateTypeValue = @"candidate";
 | 
|  static NSString const *kRTCICECandidateMidKey = @"id";
 | 
|  static NSString const *kRTCICECandidateMLineIndexKey = @"label";
 | 
|  static NSString const *kRTCICECandidateSdpKey = @"candidate";
 | 
| +static NSString const *kRTCICECandidatesTypeKey = @"candidates";
 | 
| +
 | 
|  
 | 
|  @implementation RTCIceCandidate (JSON)
 | 
|  
 | 
| @@ -30,6 +32,43 @@ static NSString const *kRTCICECandidateSdpKey = @"candidate";
 | 
|                                         sdpMid:mid];
 | 
|  }
 | 
|  
 | 
| ++ (NSData *)JSONDataForIceCandidates:(NSArray<RTCIceCandidate *> *)candidates
 | 
| +                            withType:(NSString *)typeValue {
 | 
| +  NSMutableArray *jsonCandidates =
 | 
| +      [NSMutableArray arrayWithCapacity:candidates.count];
 | 
| +  for (RTCIceCandidate *candidate in candidates) {
 | 
| +    NSDictionary *jsonCandidate = [candidate JSONDictionary];
 | 
| +    [jsonCandidates addObject:jsonCandidate];
 | 
| +  }
 | 
| +  NSDictionary *json = @{
 | 
| +    kRTCICECandidateTypeKey : typeValue,
 | 
| +    kRTCICECandidatesTypeKey : jsonCandidates
 | 
| +  };
 | 
| +  NSError *error = nil;
 | 
| +  NSData *data =
 | 
| +      [NSJSONSerialization dataWithJSONObject:json
 | 
| +                                      options:NSJSONWritingPrettyPrinted
 | 
| +                                        error:&error];
 | 
| +  if (error) {
 | 
| +    RTCLogError(@"Error serializing JSON: %@", error);
 | 
| +    return nil;
 | 
| +  }
 | 
| +  return data;
 | 
| +}
 | 
| +
 | 
| ++ (NSArray<RTCIceCandidate *> *)candidatesFromJSONDictionary:
 | 
| +    (NSDictionary *)dictionary {
 | 
| +  NSArray *jsonCandidates = dictionary[kRTCICECandidatesTypeKey];
 | 
| +  NSMutableArray<RTCIceCandidate *> *candidates =
 | 
| +      [NSMutableArray arrayWithCapacity:jsonCandidates.count];
 | 
| +  for (NSDictionary *jsonCandidate in jsonCandidates) {
 | 
| +    RTCIceCandidate *candidate =
 | 
| +        [RTCIceCandidate candidateFromJSONDictionary:jsonCandidate];
 | 
| +    [candidates addObject:candidate];
 | 
| +  }
 | 
| +  return candidates;
 | 
| +}
 | 
| +
 | 
|  - (NSData *)JSONData {
 | 
|    NSDictionary *json = @{
 | 
|      kRTCICECandidateTypeKey : kRTCICECandidateTypeValue,
 | 
| @@ -49,4 +88,13 @@ static NSString const *kRTCICECandidateSdpKey = @"candidate";
 | 
|    return data;
 | 
|  }
 | 
|  
 | 
| +- (NSDictionary *)JSONDictionary{
 | 
| +  NSDictionary *json = @{
 | 
| +    kRTCICECandidateMLineIndexKey : @(self.sdpMLineIndex),
 | 
| +    kRTCICECandidateMidKey : self.sdpMid,
 | 
| +    kRTCICECandidateSdpKey : self.sdp
 | 
| +  };
 | 
| +  return json;
 | 
| +}
 | 
| +
 | 
|  @end
 | 
| 
 |